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.