Подавление системных вызовов при использовании gcc / g ++ - PullRequest
7 голосов
/ 03 марта 2011

У меня есть портал в локальной сети моего университета, где люди могут загружать код для программирования головоломок на C / C ++.Я хотел бы сделать портал безопасным, чтобы люди не могли совершать системные вызовы с помощью представленного кода.Может быть несколько обходных путей, но я хотел бы знать, смогу ли я сделать это, просто установив некоторые умные флаги gcc.libc по умолчанию включает <unistd.h>, который является базовым файлом, в котором объявляются системные вызовы.Есть ли способ, которым я мог бы сказать gcc / g ++ «игнорировать» этот файл во время компиляции, чтобы ни одна из функций, объявленных в unistd.h, не была доступна?

Ответы [ 3 ]

3 голосов
/ 04 марта 2011

Ограничение доступа к заголовочному файлу не помешает вам получить доступ к libc функциям: они все еще доступны, если вы ссылаетесь на libc - у вас просто не будет прототипов (и макросов) под рукой; но вы можете скопировать их сами.

И не связывание с libc тоже не поможет: системные вызовы могут быть сделаны напрямую через встроенный ассемблер (или даже хитрости, связанные с переходом в данные).

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

3 голосов
/ 04 марта 2011

Какая-то конкретная причина, по которой chroot("/var/jail/empty"); setuid(65534); недостаточно хороша (при условии, что 65534 имеет разумные пределы)?

2 голосов
/ 04 марта 2011

-D может перезаписывать отдельные имена функций. Например:

gcc file.c -Dchown -Dchdir

Или вы можете сами установить охрану включения:

gcc file.c -D_UNISTD_H

Однако их эффекты могут быть легко отменены интеллектуальными отправителями с помощью #undef s:)

...