GDB, кажется, игнорирует исполняемые возможности - PullRequest
7 голосов
/ 05 декабря 2010

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

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

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

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

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

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

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

Ответы [ 4 ]

9 голосов
/ 18 августа 2014

Я столкнулся с той же проблемой, и в начале я думал так же, как и выше, что, возможно, GDB игнорирует возможности исполняемого файла по соображениям безопасности. Однако, читая исходный код и даже используя отладку eclipse для самого gdb при отладке моей программы ext2fs-prog, которая открывает /dev/sda1, я понимаю, что:

  1. GDB не является особенным, как любая другая программа. (Точно так же, как в матрице, даже сами агенты подчиняются одному и тому же физическому закону, гравитации и т. Д., За исключением того, что все они хранители дверей.)
  2. GDB - это не родительский процесс отлаживаемого исполняемого файла, а дедушка.
  3. Истинный родительский процесс отлаживаемого исполняемого файла - это "оболочка", т.е. в моем случае /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.

3 голосов
/ 13 февраля 2013

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

3 голосов
/ 05 декабря 2010

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

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

2 голосов
/ 05 января 2018

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

sudo gdbserver localhost:12345 /path/to/application

и затем присоедините экземпляр GDB вашей IDE к этому (локальному) GDBServer.

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

...