Вопрос

Я отладку программы, которая использует libnetfilter_queue. Отказ Документация заявляет, что приложение для обработки очереди пользователей, требуется CAP_NET_ADMIN возможность функционировать. Я сделал это, используя setcap Утилита следующим образом:

$ sudo setcap cap_net_raw,cap_net_admin=eip ./a.out

Я проверил, что возможности применяются правильно как A) Программа работает и б) getcap Возвращает следующий выход:

$ getcap ./a.out
./a.out = cap_net_admin,cap_net_raw+eip

Однако, когда я пытаюсь отладить эту программу, используя gdb (например $ gdb ./a.out) из командной строки он не удается из-за отсутствия правильных наборов разрешений. Функциональность отладки gdb Работает отлично иначе и отладки в соответствии с нормальными.

Я даже попытался применить эти возможности к gdb Бинарный сам безрезультатно. Я сделал это, как казалось (как документировано мастерство что "i«Флаг может позволить от отладчике наследовать возможности от отладчика.

Есть ли что-то тривиальное, я скучаю, или это действительно не может быть сделано?

Это было полезно?

Решение

Некоторое время назад я столкнулся с такой же проблемой. Я предполагаю, что запуск отлаженной программы с дополнительными возможностями - это проблема безопасности.

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

Другие советы

Я бегаю в ту же проблему, и в начале я думал так же, как указано выше, что, возможно, GDB игнорирует возможности исполняемости из-за причины безопасности. Тем не менее, чтение исходного кода и даже с использованием самого отладки Eclipse GDB, когда он отладки My Ext2FS-Prog, которая открывается /dev/sda1, Я понимаю, что:

  1. GDB не является специальным, как и любая другая программа. (Как будто это в матрице, даже сами агенты они подчиняются ту же физическому законодательству, гравитации и т. Д., За исключением того, что они все хранители двери.)
  2. GDB не является родительским процессом отлаженного исполняемого исполняемого, а не является великим отцом.
  3. Истинный родительский процесс отлаженного исполняемого исполняемого исполняемого файла - «Shell», то есть /bin/bash в моем случае.

Итак, решение очень просто, кроме добавления cap_net_admin,cap_net_raw+eip В GDB вы также примените это к вашей оболочке. т.е. setcap cap_net_admin,cap_net_raw+eip /bin/bash

Причина, по которой вы также должны сделать это с GDB, заключается в том, что GDB является родительским процессом /bin/bash перед созданием отлаженного процесса.

Настоящая исполняемая командная строка внутри GDB такая как следующая:

/bin/bash exec /my/executable/program/path

И это параметр для VFork внутри GDB.

Для тех, у кого такая же проблема, вы можете обойти этот, выполняющий GDB с Sudo.

Для тех, кто работает GDB через IDE, Sudo-ing GDB (как в ответ @ @ Stéphane J.) может быть невозможно. В этом случае вы можете запустить:

sudo gdbserver localhost:12345 /path/to/application

А затем прикрепите экземпляр GDB IDE к этому (локальному) GDBSERVER.

В случае Eclipse CDT это означает создание нового отладочной конфигурации «C / C ++ удаленного приложения», затем под вкладкой «Отладчик»> «Включение подключения», вводя в TCP / Localhost / 12345 (или любой порт, который вы выбрали выше). Это позволяет отладить в Eclipse, в то время как ваше приложение имеет привилегированный доступ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top