Неожиданное поведение при запуске iptables из переполнения стека

Я запускаю следующий код из PHP

$ipAddress=$_SERVER['REMOTE_ADDR'];
$mac = `arp -an |grep $ipAddress | awk '{print $4}'`;
$c = "sudo iptables -t mangle -I internet 1 -m mac --mac-source $mac -j RETURN";
shell_exec($c);

после этого вывод

#iptables -L -v -t mangle

pkts bytes target     prot opt in     out     source               destination
215 18676            all  --  *      *       0.0.0.0/0            0.0.0.0/0            MAC D0:17:C2:48:1E:4F
26  1717 RETURN     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
0     0 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
340 26189 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0            MARK set 0x63

обратите внимание, что нет возврата в цель

Если я запускаю ту же команду из оболочки bash, что и sudo, вывод

$ sudo iptables -t mangle -I internet -m mac --mac-source D0:17:C2:48:1E:4F -j RETURN

pkts bytes target     prot opt in     out     source               destination
0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            MAC D0:17:C2:48:1E:4F
0     0 RETURN     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
0     0 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
0     0 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0            MARK set 0x63

Обратите внимание, что в цель есть ВОЗВРАТ

Я модифицировал sudoers с помощью visudo, чтобы позволить php запускать указанную команду от имени пользователя root

Я также пробовал system (), exec и использование оператора backtick в php. Но все одинаково.

Я не мог понять, почему это происходит и как исправить это.

1

Решение

Строка, присвоенная $mac заканчивается символами новой строки, тем самым нарушая iptables команда. Удаление новой строки, например, с помощью explode вместо awk, должен это исправить:

$ipArp = `arp -an | grep $ipAddress`;
$mac = explode(' ', $ipArp)[3];

Хочу добавить, что такой сценарий меня немного пугает. Слепая передача значений в команду оболочки может иметь очень плохие последствия. Я не думаю, что этот конкретный сценарий можно использовать, но предоставление разрешений sudo для PHP не является хорошей идеей с точки зрения безопасности.

1

Другие решения

Решение :-

Я сделал скрипт / usr / bin / addtheuser и дал sudo доступ к www-данным только для этого скрипта.

/ USR / бен / addtheuser: —

iptables -t mangle -i wlan0 -I internet 1 -m mac --mac-source $1 -j RETURN

Когда я попытался запустить с PHP

$c = "sudo /usr/bin/addtheuser ".$mac;
shell_exec($c);

Теперь все заработало как положено.

1