Я работаю в системе, подобной Ideone, где недоверенный пользовательский код должен работать в режиме песочницы.
Для этого я искал возможности ptrace
для первого уровня защиты. Однако после нескольких экспериментов кажется, что:
Я хочу перехватить определенные системные вызовы и вернуть поддельный код результата без фактического вызова. Есть ли способ реализовать это?
Помните, что ваша песочница может быть защищена только в том случае, если ее код не является многопоточным. Вы также должны быть очень осторожны, чтобы не допустить разветвления кода в песочнице.
См., Например, следующее обсуждение статьи Роберта Уотсона о проблемах:
Эксплуатация рас в оболочках системных вызовов
Ссылка на статью приведена в этой статье, но я также предлагаю ссылку здесь:
«Использование уязвимостей параллелизма в оболочках системных вызовов»
Кажется, что лучший подход, как и рекомендует Watson: полностью интегрировать инфраструктуру безопасности в ядро и позаботиться о ее использовании, чтобы избежать проблем параллелизма. Linux и NetBSD, Mac OS X и другие системы, ориентированные на безопасность, уже предоставляют такие платформы, и поэтому все, что необходимо для использования этих систем, — это реализовать ваши политики в этих существующих платформах. То есть даже не пытайтесь реализовать свои политики безопасности в оболочках системных вызовов или других механизмах вставки системных вызовов.
Вы можете перейти к инструкции, которая выполняет системный вызов, увеличив IP (указатель инструкции), таким образом, вызов не будет выполнен, и вы можете установить возвращаемое значение как обычно.
Редактировать:
Там есть ptrace обертка pinktrace, это должно облегчить вашу работу, а также дополнительную информацию здесь:
https://security.stackexchange.com/questions/8484/wrapping-system-call-in-reliable-and-secure-way