Команда sudo не работает, когда strace прилагается с PID bash

Я беру журналы команды, выполняемые пользователем в выходном файле, добавляя PID BASH в strace .

$ strace -q -f -e execve -p $$ -o <outputFile>

Он работает нормально, и я получаю весь список команд в выходном файле.

Но я столкнулся с другой проблемой. Я не могу запустить команду sudo когда strace прилагается с BASH PID.

Я получаю следующую ошибку:

sudo: effective uid is not 0, is sudo installed setuid root?

Я проверил setuid , установленный на sudo binary

---s--x--x. 1 root root 123832 Mar 22 11:35 /usr/bin/sudo

sudo отлично работает, когда я останавливаю strace .

Это ошибка или есть какая-то техническая причина? Пожалуйста помоги мне с этим.

  • Рекурсивный chmod без sudo
  • sudo зависает при запуске на удаленном хосте поверх ssh в скрипте без tty (-t)
  • Как запустить программу GUI как другого пользователя (Debian)?
  • Какие плохие вещи могут произойти, если мы не будем использовать sudoedit?
  • Galera + systemd: wsrep_notify_cmd терпит неудачу с sudo (невозможно изменить в sudoers gid: операция не разрешена)
  • rsync как другой пользователь
  • Ошибка открытия кеша
  • Каков мой пароль sudo?
  • 2 Solutions collect form web for “Команда sudo не работает, когда strace прилагается с PID bash”

    Существуют и другие способы регистрации всех команд, выполняемых пользователем. С установленным sysdig можно запустить что-то вроде

     # sysdig "user.name = jdoe and evt.type = execve" 

    регистрировать все вызовы execve(2) jdoe ; опция -p для sysdig может настроить формат вывода и т. д.

    Другой способ – использовать SystemTap который имеет то преимущество, что поддерживается RedHat; здесь мы предполагаем, что jdoe имеет UID 1000 ;

     probe begin { printf("begin trace...\n\n") } probe syscall.execve.return { if (uid() != 1000) next; printf("runs %s[%d]: %s\n", execname(), pid(), cmdline_str()); } 

    это может быть выполнено через что-то вроде

     # stap-prep ... # stap whatyousavedtheaboveas.stp 

    Оба метода, скорее всего, потребуют корректировки, чтобы точно зафиксировать то, что вам нужно, обрабатывать условия ошибки, когда execve не работает, и т. Д. С плюсом стороны sysdig и SystemTap намного эффективнее, чем strace (запустите vmstat 1 и посмотрите, как strace подталкивает контекстные переключатели через крыша при работе).

    В руководстве для strace упоминается, что:

    ОШИБКИ
    Программы, использующие бит setuid, не имеют эффективных прав идентификатора пользователя во время трассировки.

    Хотя я подозреваю, что это больше связано с последствиями безопасности для отладки процесса setuid, чем ошибка. Если я не ошибаюсь, strace использует тот же интерфейс трассировки, что, скажем, gdb , и позволяет, среди прочего, изменять память текущего процесса. Возможность сделать это для процесса, который работает с большей привилегией, чем вы предполагали, будет плохой идеей.

    Linux и Unix - лучшая ОС в мире.