Поддержка pledge(2) в языках программирования


Одним из новшеств релиза OpenBSD 5.9 было добавление системного вызова pledge(2).

Pledge похож на множество других механизмов ограничения доступа к системным вызовам, таких как seccomp, capsicum и systrace, но в отличие от них разработан с оглядкой на максимальное упрощение применения.

Pledge требует внесения в приложения специальных аннотаций, определяющих уровень привилегий на текущем этапе выполнения приложения. Вместо детализации на уровне отдельных системных вызовов, Pledge манипулирует классами доступа. Аннотации выставляются через указание функции pledge(), первым аргументом которой является список разрешённых классов системных вызовов, а вторым - массив файловых путей, куда разрешён доступ. После сборки и запуска модифицированного приложения, ядро берёт на себя работу по контролю соблюдения заданных правил. При этом вместо традиционной блокировки доступа к неразрешённым системным вызовов применён иной подход - в случае выявления несанкционированного поведения приложение принудительно завершается. По замыслу разработчиков подобный подход заметно усложняет исследование возможных путей обхода ограничений в процессе атаки.

Больше узнать про механизм можно из доклада Тео: видео и слайды.

Естественно, что разработчики добавили возможность использования pledge(2) только для C. Поэтому я очень удивился когда обнаружил, что разные заинтересованные люди из сообщества самостоятельно сделали поддержку pledge(2) для других языков программирования: Javascript, Perl, Rust, Python, Golang, Lua, Haskell, .NET (C#, F# and VB), ksh, Erlang, Scheme, Nim.

Метки: opensource openbsd