Os intérpretes seguros do TCL funcionam com expect . Para ilustrar, criei dois scripts: unsafe.exp representando o arquivo enviado pelo usuário e safe.exp , que usa um intérprete seguro para executar unsafe.exp . Aqui está o código de unsafe.exp :
#!/usr/bin/expect
spawn whoami
expect {
"user" { send_user "safe success\n" }
"root" { send_user "unsafe success\n" }
}
A execução de unsafe.exp como root resulta em
# expect unsafe.exp
spawn whoami
root
unsafe success
Agora, safe.exp impedirá que o usuário use comandos perigosos, como spawn , enquanto ainda fornece acesso a recursos essenciais, como send e expect . Aqui está o código:
#!/usr/bin/expect
# create a safe interpreter
interp create -safe untrusted
# provide it with essetial expect functions
interp alias untrusted send_user {} send_user
interp alias untrusted send {} send
interp alias untrusted expect {} expect
interp alias untrusted interact {} interact
# censor the "spawn" function
# not providing it would be just as safe, but scripts using it would fail
proc safe_spawn {args} {
puts "censored spawn"
}
interp alias untrusted spawn {} safe_spawn
# create a safe process to interact with
spawn sudo -u user whoami
# run unsafe.exp
untrusted invokehidden source unsafe.exp
Executando safe.exp como resultado raiz em
# expect safe.exp
spawn sudo -u user whoami
censored spawn
user
safe success
Espero que isso ajude alguém. Comentários sobre possíveis problemas de segurança com esta abordagem são bem-vindos.