Маршрутизация — это способ перечислить существующие разделы и их расположение, свойства, версии, и определить доступность одних разделов и их подразделов для других. Последнее позволяет повысить переносимость, а также контроль и безопасность, включая защищённую работу с недоверенными разделами.
sections some {
/* Необязательное перечисление имён как оглавление
name ( ... )
*/
// расположение доступных разделов
locate (
//простейшее указание по одному
math = file("base/math.def");
//группа разделов по маске через переменную name
(path; io; sandbox/io; storage; random.pseudo; editor)
= file("base/"-name-".def");
//файл может содержать несколько разделов
(random; cypher) in file("base/cypher.defs") as section(name-".2");
untrusted/editor := file("trash/editor.def");
fileman := file("files/fileman.def");
//заглушка для раздела
compress := stub of file("base/compress.def")
)
// перечисляет ограниченные по умолчанию разделы
restricted = {path}
/* указание доступности для импорта одних разделов другими.
отсутствие прямого импорта не ограничивает косвенный импорт
и косвенные вызовы */
allow (
// редактор может получить доступ только к указанному файлу
{path} for {editor}
/* хранилище предоставляет ограниченный доступ к системе,
но само имеет полный доступ для его воплощения */
{path +all} for {storage}
/* под видом предоставления некому недоверенному редактору
«полного» доступа к произвольным файлам даёт путь в изолированную
песочницу, подменив раздел ввода-вывода */
{path +all, io = sandbox/io} for {untrusted/editor}
/* те разделы, что не указаны, видны всем (other for all)
разделы с подразделами не могут входить в эту группу,
так как подразделы и нужны для разграничения ответственности */
)
// отсутствие опциональных разделов
disable (
{compress} for {fileman}
)
// строгий запрет на прямое и косвенное использование разделов
deny (
// настоящий ГПСЧ не должен использовать ввод
{io} for {random/pseudo}
)
}
Строгий запрет на использование одних разделов другими подразумевает и довольно сложный запрет на прямой или косвенный вызов процедурных переменных (полиморфных объектов), находящихся в других разделах, так как это может привести к косвенному переносу запрещённого функционала. Возможно использование процедурных переменных, лежащих внутри самого раздела, но запрещено менять их за пределами места начализации переменных в этом разделе. Также возможно явное разрешение на вызов сторонних процедур через формальные параметры подпрограмм раздела. Без возможности менять внутренние переменные это не позволяет провести внедрение запрещённого функционала в сам раздел, а косвенное применение всё равно в конечном итоге производится из вызова, которому это разрешено.
Комментариев нет:
Отправить комментарий