Safe Tcl Commandes Internes Tcl
NOM
Safe Base - Mécanisme pour la création et la manipulation d'interpréteurs sûr.
SYNTAXE
::safe::interpCreate ?slave? ?options...?
::safe::interpInit slave ?options...?
::safe::interpConfigure slave ?options...?
::safe::interpDelete slave
::safe::interpAddToAccessPath slave directory
::safe::interpFindInAccessPath slave directory
::safe::setLogCmd ?cmd arg...?
OPTIONS
?-accessPath pathList? ?-statics boolean? ?-noStatics? ?-nested boolean? ?-nestedLoadOk? ?-deleteHook script?
DESCRIPTION
Safe Tcl est un mécanisme pour exécuter des scripts Tcl étrangers sans risque et pour fournir un accès à de tels scripts potentiellement dangereux.
Safe Base s'assure que des scripts Tcl étrangers ne peuvent nuire à l'application hôte. Safe Base prévient les attaques d'intégrité et de sécurité. Les scripts étrangers sont empêchés de corrompre l'état de l'application ou de l'ordinateur hôte. Ces scripts sont également empêchés de révéler l'information stockée sur l'ordinateur principal ou dans l'application hôte à n'importe quel espion.
Safe Base permet à un interprèteur maître de créer des interprèteurs sécurisés et restreints qui contiennent un ensemble d'alias prédéfinis pour les commandes
source,
load,
file,
encoding, et
exit et peuvent employer des mécanismes d'auto-chargement et de paquet.
Aucune connaissance de la structure de système de fichiers n'est nécessaire à l'interprèteur sûr, parce qu'il accède seulement à un chemin virtuel contenant des repères. Quand l'interprèteur sûr demande le source d'un fichier, il emploie les repères dans le chemin virtuel en tant qu'élément du nom du fichier; l'interprèteur maître d'une manière transparente traduit les repères en vrais noms de répertoires et exécute l'opération demandée (voir la section SECURITE ci-dessous pour les détails). Différents niveaux de sécurité peuvent être choisis en employant les flags optionnels des commandes décrites ci-dessous.
Toutes les commandes fournies dans l'interprèteur maître par la commande Safe Base résident dans le namespace safe:
COMMANDES
Les commandes suivantes sont fournies dans le maître interpréteur:
- ::safe::interpCreate ?slave? ?options...?
- Crée un interprèteur sûr, installe les alias décrits dans la section ALIAS et initialise le mécanisme d'auto-chargement et de paquet comme indiqué par les options fournies. Voir la section OPTIONS ci-dessous pour un description de l optionnel arguments. ci-dessous pour une description des arguments facultatifs. Si l'argument slave est omis, un nom sera généré.. ::safe::interpCreate renvoie toujours le nom d'interprèteur.
::safe::interpInit slave ?options...?
- Cette commande est identique à interpCreate excepté qu'elle ne crée pas l'interprèteur sûr. slave doit avoir été créé par d'autres moyens, comme interp create-safe.
::safe::interpConfigure slave ?options...?
- Si aucunes options ne sont données, renvoie les paramètres pour toutes les options de l'interprèteur sûr comme liste d'options et leurs valeurs courantes pour slave. Si un argument additionnel est fourni, renvoie une liste de 2 éléments name et value où name est le nom complet de cette option et value la valeur courante pour cette option et slave. Si plus de deux arguments additionnels sont fournis, il modifiera l'interprèteur sûr et changera chacunes et seulement les option fournies. Voir la section OPTIONS ci-dessous pour la description d'options. Exemple d'utilisation:
# Crée un nouvel interp avec la même configuration que "$i0" :
set i1 [eval safe::interpCreate [safe::interpConfigure $i0]]
# Obtient le deleteHook courant
set dh [safe::interpConfigure $i0 -del]
# Change (seulement) l'attribut de chargement statics ok d'un interp
# et son deleteHook (laissant le reste inchangé) :
safe::interpConfigure $i0 -delete {foo bar} -statics 0 ;
::safe::interpDelete slave
- Efface l'interprèteur sûr et nettoie les structures de données principales correspondantes d'interprèteur. Si un script deleteHook a été spécifié pour cet interpréteur, il est évalué avant l'interpréteur que soit effacé, avec le nom de l'interpréteur comme argument additionnel.
::safe::interpFindInAccessPath slave directory
- Cette commande trouve et renvoie le jeton pour le vrai répertoire directory de l'accès au chemin virtuel courant de l'interprèteur sûr. Elle génère une erreur si le répertoire n'est pas trouvé. Exemple d'utilisation:
$slave eval [list set tk_library [::safe::interpFindInAccessPath $ name $tk_library]]
::safe::interpAddToAccessPath slave directory
- Cette commande ajoute directory au chemin virtuel maintenu pour l'interprèteur sûr dans le maître, et retourne un jeton qui peut être utilisé dans l'interpréteur sûr pour obtenir accès aux fichiers dans ce répertoire. Si le répertoire est déjà dans le chemin virtuel, elle renvoie seulement le jeton sans ajouter le répertoire au chemin virtuel de nouveau. Exemple d'utilisation:
 $slave eval [list set tk_library [::safe::interpAddToAccessPath $nom $ tk_library]]
::safe::setLogCmd ?cmd arg...?
- Cette commande installe un script qui sera appelé quand les événements intéressants du cycle de vie se produisent pour un interprèteur sûr. Une fois appelée sans arguments, elle renvoie le script actuellement installé. Si appelée avec un argument, une chaîne vide, le script actuellement installé est enlevé et la journalisation est arrêtée. Le script sera appelé avec un argument supplémentaire, une chaîne décrivant l'évènement intéressant. Le but principal est d'aider le debugging des interpréteur sûrs. En utilisant ce service vous pouvez obtenir des message d'erreurs complets pendant que l'interpréteur sûr reçoit seulement des messages d'erreurs génériques. Ceci empêche l'interpréteur sûr de voir des messages au sujet des échecs et d'autres événements qui pourraient contenir une information sensible telle que de vrais noms de répertoire.
Exemple d'utilisation:
::safe::setLogCmd puts stderr
Ci-dessous vous trouverez la sortie d'une session exemple dans laquelle un interpréteur sûr a essayé de " sourcer " un fichier non trouvé dans son chemin d'accès virtuel. Notez que l'interpréteur sûr a seulement reçu un message d'erreur disant que le fichier n'a pas été trouvé:
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
OPTIONS
Les options suivantes sont communes à
::safe::interpCreate,
::safe::interpInit, et
::safe::interpConfigure. N'importe quel nom d'option peut être abrégé à son nom non-ambigu minimal. Les noms d'option ne sont ne sont pas sensibles à la casse.
- -accessPath directoryList
- Cette option place la liste de répertoires desquels l'interpréteur sûr peut source et load des fichiers. Si cette option n'est pas spécifiée, ou si elle est donnée comme liste vide, l'interpréteur sûr emploiera les même répertoires que son maître pour auto-chargement. Voir la section SECURITE ci-dessous pour plus de détail au sujet des chemins virtuels, des jetons et du contrôle d'accès.
-statics boolean
- Cette option indique si l'interpréteur sûr sera autorisé à charger les packages statiquement liés (comme load {} Tk). La valeur par défaut est true : les interpréteur sûrs sont autorisé à charger les packages statiquement liés.
-noStatics
- Cette option est un raccourci de convenance pour -statics false et indique ainsi que l'interpréteur sûr ne sera pas autorisé à charger les packages statiquement liés.
-nested boolean
- Cette option spécifie si l'interpréteur sûr sera autorisé à charger des packages dans ses propre sous-interpréteurs. La valeur par défaut est false: les interpréteur sûrs ne sont pas autorisé à charger de packages dans leurs propres interprèteurs secondaires.
-nestedLoadOk
- Cette option est un raccourci de convenance pour -nested true et indique ainsi que l'interpréteur sûr sera autorisé à charger des packages dans ses propres interprèteurs secondaires.
-deleteHook script
- Quand à cette option est donné un script non vide, elle est évaluée dans le maître avec le nom de l'interprèteur sûr comme argument additionnel juste avant supprimer réellement l'interprèteur sûr. Donner une valeur vide enlève n'importe quel script d'effacement actuellement installé pour cet interpréteur sûr. La valeur par défaut ({}) n'est n'avoir aucun appel de suppression.
ALIAS
Les alias suivants sont fournis dans un interpréteur sûr:
- source fileName
- Le fichier requis, un fichier source Tcl, est "sourcé" dans interpréteur sûr s'il est trouvé. L'alias source peut seulement " sourcer " les fichier des répertoires qui se trouvent dans le chemin virtuel pour l'interpréteur sûr. L'alias source exige de l'interpréteur sûr qu'il utilise un des noms de jeton dans son chemin virtuel pour désigner le répertoire dans lequel le fichier a "sourcer" peut être trouvé. Voir la section sur la SECURITE pour une discussion plus approfondie des restrictions sur les noms de fichiers valides.
load fileName
- Le fichier requis, un fichier objet partagé, est chargé dynamiquement dans l'interpréteur sûr s'il est trouvé. Le nom de fichier doit contenir le nom d'un jeton mentionné dans le chemin virtuel de l'interpréteur sûr pour être trouvé avec succès. De plus, le fichier objet partagé doit contenir un point d'entrée sûr; voyez la page de manueluel de la commande load pour plus de détails.
file ?subCmd args...?
- L'alias file donne accès à un sous ensemble sûr des sous-commandes de file; il permet seulement les sous-commandes dirname, join, extension, root, tail, pathname et split. Pour plus de détails sur ces sous-commandes voyez la page de manueluel pour la commande file.
encoding ?subCmd args...?
- L'alias encoding donne accès à un sous ensemble sûr des sous-commandes de encoding il interdit de fixer l'encodage système, mais permet tout autre sous-commandes incluant system à vérifier l'encodage courant.
exit
- L'interprèteur appelant est supprimé et son traitement est arrêté, mais le processus Tcl dans lequel cet interprèteur existe n'est pas terminé.
SECURITE
La Safe Base n'essaye pas d'empêcher complètement les attaques d'ennui et de deni de service. Ces formes d'attaque empêchent temporairement l'application ou l'utilisateur d'utiliser l'ordinateur pour effectuer des tâches utiles, par exemple en consommant tout le temps CPU ou tout l'affichage disponible. Ces attaques, quoique graves, sont considérées comme moins importantes en général que les attaques d'intégrité et d'intimité que la Safe Base doit empêcher.
Les commandes disponibles dans un interpréteur sûr, en plus de l'ensemble sûr comme défini en page de manueluel d'
interp, sont des alias de
source,
load,
exit, et des sous-ensembles sûrs de
file et
encoding. L'interpréteur sûr peut aussi auto-charger du code et il peut demander que des packages soient chargés..
Puisque certaines de ces commandes accèdent au système de fichiers local, il y a un danger potentiel de fuites d'information au sujet de la structure des répertoires. Pour empêcher ceci, les commandes qui prennent des noms de fichier comme aguments dans un interpréteur sûr utilisent des jetons au lieu des noms réels de répertoires. Ces jetons sont traduits en nom réel de répertoire pendant qu'une requête pour, ex., sourcer un fichier est traitée par le maître interpréteur. Ce système de chemin virtuel est maintenu dans l'interprèteur principal pour chaque interprèteur sûr créé par
::safe::interpCreate ou initialisé par
::safe::interpInit et le chemin pointe des jetons accessibles dans l'interpréteur sûr vers les noms de chemin réels sur le système de fichier local empêchant de ce fait les interprèteurs sûrs de connaître la structure du système de fichiers de la machine sur lequel l'interprèteur s'exécute. Les seuls arguments valides de noms de fichier pour les alias
source et
load fournis à l'esclave sont des chemin sous la forme de
[file jointokenfilename] (ie, en utilisant les formats natifs de chemin:
token/filename sous Unix,
token\filename sous Windows, et
token:filename sur Mac), où
token représente un des répertoires de la liste
accessPath et
filename est un fichier dans ce répertoire (on ne permet aucun accès aux sous-répertoires).
Quand un jeton est utilisé par un interpréteur sûr dans un requête pour " sourcer " ou charger un fichier, le jeton est vérifié et traduit en un nom réel de chemin et le fichier a "sourcer" ou chargé est localisé sur le système de fichier. L'interpréteur sûr n'a jamais connaissance du nom de chemin actuel sous lequel le fichier est stocké sur le système de fichier.
Pour empêcher une fuite d'information potentielle à partir de fichiers sensibles accidentellement inclus dans l'ensemble de fichiers qui peut être "sourcé" par un interpréteur sûr, l'alias
source restreint l'accès aux fichiers respectant les contraintes suivantes: le nom de chemin ne doit pas avoir plus de quatorze caractères, ne doit pas contenir plus d'un point ("
."), doit finir avec l'extension
.tcl ou être appelé
tclIndex.
Chaque élément de la liste initiale de chemin d'accès sera assigné à un jeton qui sera placée dans l'auto_path de l'esclave et le premier élément de cette liste sera fixé en tant que tcl_library pour cet esclave.
Si l'argument de chemin d'accès n'est pas donné ou est une liste vide, le comportement par défaut est de laisser l'esclave acceder aux mêmes packages que le maître (ou pour être plus précis: seulement les packages écrits en Tcl (ne peuvent pas être dangereux tant qu'ils fonctionnent dans l'interpréteur esclave) et les extensions C qui fournissent un point d'entrée Safe_Init). Dans ce but, l'auto_path du maître sera employé pour construire le chemin d'accès de l'esclave. Pour que l'esclave charge avec succès la bibliothèque Tcl (qui inclut le mécanisme d'auto-chargement) la tcl_library sera ajoutée ou déplacée à la première position si nécessaire, dans le chemin d'accès de l'esclave, ainsi la tcl_library esclave sera la même que celle du maître (son vrai chemin sera cependant toujours invisible à l'esclave). Pour que l'auto-chargement fonctionne de même pour l'esclave et le maître dans ce cas par défaut, les sous répertoires de premier-niveau de chaque répertoire dans l'auto_path du maître sera aussi ajouté (si aucun n'est déjà inclus) au chemin d'accès de l'esclave. Vous pouvez toujours indiquer un chemin plus restrictif pour lequel les sous répertoires ne seront jamais recherchés explicitement en spécifiant votre liste de répertoires avec le flag -accessPath au lieu de compter sur ce mécanisme par défaut.
Quand le
accessPath est changé après la première création ou l'initialisation (c.a.d au travers de
interpConfigure -accessPathlist), un
auto_reset est automatiquement évalué dans l'interpréteur sûr pour synchroniser son
auto_index avec la nouvelle liste de jetons
VOIR EGALEMENT
Dernière révision: 8.0