Spec-Zone.ru › Tcl/Tk

safe

ИМЯ
safe — Создание и управление безопасными интерпретаторами
СИНТАКСИС
ПАРАМЕТРЫ
ОПИСАНИЕ
КОМАНДЫ
::safe::interpCreate ?slave? ?options...?
::safe::interpInit slave ?options...?
::safe::interpConfigure slave ?options...?
::safe::interpDelete slave
::safe::interpFindInAccessPath slave directory
::safe::interpAddToAccessPath slave directory
::safe::setLogCmd ?cmd arg...?
ПАРАМЕТРЫ
-accessPath directoryList
-statics boolean
-noStatics
-nested boolean
-nestedLoadOk
-deleteHook script
ПСЕВДОНИМЫ
source fileName
load fileName
file ?subCmd args...?
encoding ?subCmd args...?
exit
БЕЗОПАСНОСТЬ
СМОТРИ ТАКЖЕ
КЛЮЧЕВЫЕ СЛОВА

Имя

safe — Создание и управление безопасными интерпретаторами

Синтаксис

::safe::interpCreate ?slave? ?options...?
::safe::interpInitslave ?options...?
::safe::interpConfigureslave ?options...?
::safe::interpDeleteslave
::safe::interpAddToAccessPathslavedirectory
::safe::interpFindInAccessPathslavedirectory
::safe::setLogCmd ?cmd arg...?

Параметры

?-accessPathpathList? ?-staticsboolean? ?-noStatics? ?-nestedboolean? ?-nestedLoadOk? ?-deleteHookscript?

Описание

Безопасный Tcl — это механизм для безопасного выполнения недоверенных скриптов Tcl и предоставления посреднического доступа таких скриптов к потенциально опасным функциям.

Безопасный Tcl гарантирует, что недоверенные Tcl-скрипты не могут навредить принимающему приложению. Он предотвращает атаки на целостность и конфиденциальность. Недоверенные Tcl-скрипты предотвращены от повреждения состояния принимающего приложения или компьютера. Недоверенные скрипты также предотвращены от раскрытия информации, хранящейся на принимающем компьютере или в принимающем приложении любой стороне.

Безопасный Tcl позволяет главному интерпретатору создавать безопасные, ограниченные интерпретаторы, которые содержат набор предопределенных псевдонимов для команд source, load, file, encoding и exit и способны использовать механизмы автоматической загрузки и пакетов.

Никакие сведения о структуре файловой системы не передаются безопасному интерпретатору, поскольку он имеет доступ только к виртуализированному пути, содержащему токены. Когда безопасный интерпретатор запрашивает загрузку файла, он использует токен в виртуальном пути как часть имени файла для загрузки; главный интерпретатор прозрачно преобразует токен в реальное имя каталога и выполняет запрошенную операцию (см. раздел БЕЗОПАСНОСТЬ ниже для получения подробностей). Разные уровни безопасности могут быть выбраны с помощью необязательных флагов команд, описанных ниже.

Все команды, предоставляемые в главном интерпретаторе с помощью Safe Tcl, находятся в пространстве имен safe.

Команды

Следующие команды предоставляются в главном интерпретаторе:
::safe::interpCreate ?slave? ?options...?
Создает безопасный интерпретатор, устанавливает псевдонимы, описанные в разделе ПСЕВДОНИМЫ и инициализирует механизм автоматической загрузки и пакетов, как указано в предоставленных options. См. раздел ПАРАМЕТРЫ ниже для описания необязательных аргументов. Если аргумент slave опущен, будет сгенерировано имя. ::safe::interpCreate всегда возвращает имя интерпретатора.
::safe::interpInit slave ?options...?
Эта команда аналогична interpCreate, за исключением того, что она не создает безопасный интерпретатор. slave должен быть создан каким-либо другим способом, например, interp create -safe.
::safe::interpConfigure slave ?options...?
Если options не заданы, возвращает параметры всех параметров для указанного безопасного интерпретатора в виде списка параметров и их текущих значений для этого slave. Если предоставлен один дополнительный аргумент, он вернет список из 2 элементов name и value, где name — полное имя параметра, а value — текущее значение этого параметра для slave. Если предоставлено более двух дополнительных аргументов, он переконфигурирует безопасный интерпретатор и изменит только предоставленные параметры. См. раздел ПАРАМЕТРЫ ниже для описания параметров. Пример использования:
# Create new interp with the same configuration as "$i0":
set i1 [safe::interpCreate {*}[safe::interpConfigure $i0]]

# Get the current deleteHook
set dh [safe::interpConfigure $i0  -del]

# Change (only) the statics loading ok attribute of an
# interp and its deleteHook (leaving the rest unchanged):
safe::interpConfigure $i0  -delete {foo bar} -statics 0
::safe::interpDelete slave
Удаляет безопасный интерпретатор и очищает соответствующие структуры данных главного интерпретатора. Если для этого интерпретатора был указан скрипт deleteHook, он будет вычислен перед удалением интерпретатора с именем интерпретатора в качестве дополнительного аргумента.
::safe::interpFindInAccessPath slave directory
Эта команда находит и возвращает токен для реального каталога directory в текущем виртуальном пути доступа безопасного интерпретатора. Она генерирует ошибку, если каталог не найден. Пример использования:
$slave eval [list set tk_library \
      [::safe::interpFindInAccessPath $name $tk_library]]
::safe::interpAddToAccessPath slave directory
Эта команда добавляет directory к виртуальному пути, поддерживаемому для безопасного интерпретатора в главном интерпретаторе, и возвращает токен, который можно использовать в безопасном интерпретаторе для получения доступа к файлам в этом каталоге. Если каталог уже находится в виртуальном пути, он только возвращает токен, не добавляя каталог в виртуальный путь снова. Пример использования:
$slave eval [list set tk_library \
      [::safe::interpAddToAccessPath $name $tk_library]]
::safe::setLogCmd ?cmd arg...?
Эта команда устанавливает скрипт, который будет вызываться при возникновении интересных событий жизненного цикла для безопасного интерпретатора. При вызове без аргументов возвращает текущий установленный скрипт. При вызове с одним аргументом, пустой строкой, текущий установленный скрипт удаляется, и ведение журнала отключается. Скрипт будет вызван с одним дополнительным аргументом, строкой, описывающей интересующее событие. Основная цель — помочь в отладке безопасных интерпретаторов. Используя эту возможность, вы можете получить полные сообщения об ошибках, в то время как безопасный интерпретатор получает только общие сообщения об ошибках. Это предотвращает безопасный интерпретатор от просмотра сообщений об ошибках и других событиях, которые могут содержать конфиденциальную информацию, такую как реальные имена каталогов.

Пример использования:

::safe::setLogCmd puts stderr

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

NOTICE for slave interp10 : Created
NOTICE for slave interp10 : Setting accessPath=(/foo/bar) staticsok=1 nestedok=0 deletehook=()
NOTICE for slave interp10 : auto_path in interp10 has been set to {$p(:0:)}
ERROR for slave interp10 : /foo/bar/init.tcl: no such file or directory

Параметры

Следующие параметры являются общими для ::safe::interpCreate, ::safe::interpInit и ::safe::interpConfigure. Любое имя параметра может быть сокращено до его минимального недвусмысленного имени. Имена параметров нечувствительны к регистру.
-accessPath directoryList
Этот параметр устанавливает список каталогов, из которых безопасный интерпретатор может загружать файлы source и load. Если этот параметр не указан или задан как пустой список, безопасный интерпретатор будет использовать те же каталоги, что и его главный для автоматической загрузки. См. раздел БЕЗОПАСНОСТЬ ниже для получения дополнительной информации о виртуальных путях, токенах и управлении доступом.
-statics boolean
Этот параметр указывает, разрешено ли безопасному интерпретатору загружать статически связанные пакеты (например, load {} Tk). Значение по умолчанию — true: безопасным интерпретаторам разрешено загружать статически связанные пакеты.
-noStatics
Этот параметр — удобное сокращение для -statics false и, следовательно, указывает, что безопасный интерпретатор не сможет загружать статически связанные пакеты.
-nested boolean
Этот параметр указывает, разрешено ли безопасному интерпретатору загружать пакеты в свои дочерние интерпретаторы. Значение по умолчанию — false: безопасным интерпретаторам запрещено загружать пакеты в свои дочерние интерпретаторы.
-nestedLoadOk
Этот параметр — удобное сокращение для -nested true и, следовательно, указывает, что безопасному интерпретатору разрешено загружать пакеты в его собственные дочерние интерпретаторы.
-deleteHook script
Если для этого параметра задан непустой script, он будет вычислен в главном интерпретаторе с именем безопасного интерпретатора в качестве дополнительного аргумента непосредственно перед фактическим удалением безопасного интерпретатора. Задание пустого значения удаляет любой текущий установленный скрипт обратной связи об удалении для этого безопасного интерпретатора. Значение по умолчанию ({}) не предусматривает обратной связи об удалении.

Псевдонимы

Следующие псевдонимы предоставляются в безопасном интерпретаторе:
source fileName
Запрашиваемый файл, файл исходного кода Tcl, подключается в безопасный интерпретатор, если он найден. Псевдоним source может подключать только файлы из каталогов в виртуальном пути безопасного интерпретатора. Псевдоним source требует, чтобы безопасный интерпретатор использовал одно из имен токенов в своем виртуальном пути для обозначения каталога, в котором можно найти файл для подключения. См. раздел БЕЗОПАСНОСТЬ для более подробного обсуждения ограничений на допустимые имена файлов.
load fileName
Запрашиваемый файл, файл разделяемой библиотеки, динамически загружается в безопасный интерпретатор, если он найден. Имя файла должно содержать имя токена, упомянутое в виртуальном пути безопасного интерпретатора, для успешного поиска. Кроме того, файл разделяемой библиотеки должен содержать безопасную точку входа; см. страницу руководства для команды load для получения более подробной информации.
file ?subCmd args...?
Псевдоним file предоставляет доступ к безопасной части подкоманд команды file; он позволяет использовать только подкоманды dirname, join, extension, root, tail, pathname и split. Для получения более подробной информации о том, что делают эти подкоманды, см. страницу руководства для команды file.
encoding ?subCmd args...?
Псевдоним encoding предоставляет доступ к безопасной части подкоманд команды encoding; он запрещает установку системного кодирования, но позволяет всем другим подкомандам, включая system, проверять текущее кодирование.
exit
Вызываемый интерпретатор удаляется, и его вычисление останавливается, но процесс Tcl, в котором существует этот интерпретатор, не завершается.

Безопасность

Безопасный Tcl не пытается полностью предотвратить раздражающие и атаки отказа в обслуживании. Эти типы атак препятствуют временному использованию приложения или пользователем компьютера для выполнения полезной работы, например, путем потребления всех доступных ресурсов ЦП или всего доступного места на экране. Хотя эти атаки раздражают, они считаются менее важными в целом, чем атаки на целостность и конфиденциальность, которые Safe Tcl должен предотвратить.

Команды, доступные в безопасном интерпретаторе, помимо безопасного набора, определенного в руководстве по interp, являются опосредованными псевдонимами для source, load, exit и безопасных подмножеств file и encoding. Безопасный интерпретатор также может автоматически загружать код и запрашивать загрузку пакетов.

Поскольку некоторые из этих команд имеют доступ к локальной файловой системе, существует потенциальная возможность утечки информации о ее структуре каталогов. Для предотвращения этого команды, принимающие имена файлов в качестве аргументов в безопасном интерпретаторе, используют токены вместо реальных имен каталогов. Эти токены переводятся в реальные имена каталогов, когда запрос на, например, подключение файла опосредуется основным интерпретатором. Система виртуального пути поддерживается в главном интерпретаторе для каждого безопасного интерпретатора, созданного с помощью ::safe::interpCreate или инициализированного с помощью ::safe::interpInit, и путь сопоставляет токены, доступные в безопасном интерпретаторе, с реальными именами путей в локальной файловой системе, тем самым предотвращая получение безопасными интерпретаторами знаний о структуре файловой системы хоста, на котором интерпретатор выполняется. Единственными допустимыми именами файлов-аргументов для псевдонимов source и load, предоставленных подчиненному, являются пути в форме [file join token filename] (т.е. при использовании собственных форматов пути к файлам: token/filename на Unix и token\filename на Windows), где token представляет один из каталогов списка accessPath, а filename — один файл в этом каталоге (доступ к подкаталогам запрещен).

Когда токен используется в безопасном интерпретаторе в запросе на подключение или загрузку файла, токен проверяется и преобразуется в реальное имя пути, и файл для подключения или загрузки находится в файловой системе. Безопасный интерпретатор никогда не получает знания о фактическом имени пути, под которым файл хранится в файловой системе.

Для дальнейшего предотвращения потенциальной утечки информации из конфиденциальных файлов, которые случайно включаются в набор файлов, которые могут быть подключены безопасным интерпретатором, псевдоним source ограничивает доступ к файлам, удовлетворяющим следующим ограничениям: имя файла должно быть четырнадцатью символами или короче, не должно содержать более одной точки («.»), должно заканчиваться расширением («.tcl») или называться («tclIndex»).

Каждый элемент начального списка пути доступа получит токен, который будет установлен в подчиненном auto_path, а первый элемент этого списка будет установлен как tcl_library для этого подчиненного.

Если аргумент пути доступа не указан или является пустым списком, по умолчанию подчиненный имеет доступ к тем же пакетам, что и основной (или, точнее, только к пакетам, написанным на Tcl (по определению не могут быть опасными, так как выполняются в подчиненном интерпретаторе) и C-расширениям, которые предоставляют точку входа _SafeInit). Для этого путь auto_path основного будет использован для построения пути доступа подчиненного. Для успешной загрузки файлов библиотеки Tcl (включая сам механизм автоматической загрузки) в подчиненный путь доступа будет добавлен или перемещен на первое место (если необходимо) tcl_library, так что tcl_library подчиненного будет таким же, как у основного (хотя его реальный путь по-прежнему будет невидим для подчиненного). Для того чтобы автоматическая загрузка работала одинаково для подчиненного и основного в этом случае по умолчанию, подкаталоги первого уровня каждого каталога в основном auto_path также будут добавлены (если они еще не включены) в путь доступа подчиненного. Вы всегда можете указать более ограниченный путь, для которого подкаталоги никогда не будут проверяться, явно указав свой список каталогов с флагом -accessPath вместо того, чтобы полагаться на этот механизм по умолчанию.

Когда accessPath изменяется после первого создания или инициализации (т.е. с помощью interpConfigure -accessPath list), в безопасном интерпретаторе автоматически вычисляется auto_reset для синхронизации его auto_index со списком новых токенов.

См. также

interp, library, load, package, source, unknownБезопасный интерпретатор,

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/safe.htm

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/safe.htm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API