GDB, кажется, игнорирует исполняемые возможности
-
08-10-2019 - |
Вопрос
Я отладку программы, которая использует 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
, Я понимаю, что:
- GDB не является специальным, как и любая другая программа. (Как будто это в матрице, даже сами агенты они подчиняются ту же физическому законодательству, гравитации и т. Д., За исключением того, что они все хранители двери.)
- GDB не является родительским процессом отлаженного исполняемого исполняемого, а не является великим отцом.
- Истинный родительский процесс отлаженного исполняемого исполняемого исполняемого файла - «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, в то время как ваше приложение имеет привилегированный доступ.