Почему strace следует другому потоку выполнения?

Я имею в виду следующую статью, посвященную атакам с использованием символьных ссылок:

struct stat st;
FILE * fp;
if (argc != 3) {
 fprintf (stderr, "usage : %s file message\n", argv [0]);
 exit(EXIT_FAILURE);
}

if (stat (argv [1], & st) < 0) {
 fprintf (stderr, "can't find %s\n", argv [1]);
 exit(EXIT_FAILURE);
}

if (st . st_uid != getuid ()) {
 fprintf (stderr, "not the owner of %s \n", argv [1]);
 exit(EXIT_FAILURE);
}

if (! S_ISREG (st . st_mode)) {
 fprintf (stderr, "%s is not a normal file\n", argv[1]);
 exit(EXIT_FAILURE);
}

sleep (25);

if ((fp = fopen (argv [1], "w")) == NULL) {
  fprintf (stderr, "Can't open\n");
  exit(EXIT_FAILURE);
}
 
fprintf (fp, "%s\n", argv [2]);
fclose (fp);
fprintf (stderr, "Write Ok\n");
exit(EXIT_SUCCESS);

Теперь, когда программа спит, я rm arg[1] (используя другой терминал), который является именем файла, а затем создаю символическую ссылку для того же файла. Когда я выполнил, как сказано в статье, я пишу в файл, на который указывает ссылка.

Затем я использовал strace, передал те же аргументы, которые он дал мне, не могу открыть, что означает, что у меня нет доступа к файлу, переданному как arg[1]. Но это не тот случай, когда я выполнял нормально, как strace обнаруживает это? Любая помощь очень ценна.

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


person kidd0    schedule 11.05.2012    source источник
comment
Вы делаете какие-то биты suid/sgid в исполняемом файле?   -  person Christopher Creutzig    schedule 11.05.2012
comment
@ChristopherCreutzig: программа использует stat (filename) для получения разрешений. Но внутри исполняемого файла я не вмешивался.   -  person kidd0    schedule 11.05.2012
comment
Я имел в виду: запускается ли программа после компиляции как двоичный файл suid? IIRC, strace проигнорирует это.   -  person Christopher Creutzig    schedule 11.05.2012
comment
После небольшого поиска в Google я получил chmod +s a.out означает, что он работает как двоичный файл suid. Да, я делаю это. Значит ли это, что strace работает так, как если бы я не выполнял эту команду?   -  person kidd0    schedule 11.05.2012
comment
Я так думаю, да. Просто используйте оболочку в качестве пользователя, от которого она будет запускаться, и запустите ее там, под strace. (Я добавлю это в ответ ниже, просто чтобы все увидели, что на вопрос был дан ответ в обзорном списке.)   -  person Christopher Creutzig    schedule 11.05.2012
comment
да, также понял, что опция strace -u username на странице руководства говорит примерно то же самое. Сослался на это   -  person kidd0    schedule 11.05.2012


Ответы (1)


Как обсуждалось выше, бинарный файл был запущен с флагом suid (chmod u+s a.out). Поскольку strace должен наблюдать за процессом и не может этого делать, если он работает от имени другого пользователя, он будет молча игнорировать s-биты.

Решение: В окне оболочки, где запущена программа, используйте логин/идентификатор пользователя, который будет использоваться без strace — учитывая, что вы только что выполнили chmod u+s a.out от имени этого пользователя, можно с уверенностью предположить, что вы можете войти под этой учетной записью. .

Для полноты: чтобы изменить свой идентификатор пользователя для одного окна оболочки, просто используйте su - otherlogin, заменив otherlogin именем входа в систему. (su = «сменить пользователя»)

person Christopher Creutzig    schedule 11.05.2012
comment
@chritopher Creutzig: Большое спасибо за такой быстрый ответ. Я не полностью прочитал справочную страницу strace. извини :) - person kidd0; 11.05.2012