[RUBY] Peut-être ai-je surestimé l'impact de Shell Shock sur CGI

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?

Expérience

Des expériences ont été réalisées avec le système de traitement suivant.

code

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'))

demande

Requête générée par curl. -A est une option pour spécifier UserAgent.

$ curl -A '() { :; }; echo Hello!' localhost/index_xxx.cgi

résultat

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%

Pourquoi

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.

Conclusion

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.

Recommended Posts

Peut-être ai-je surestimé l'impact de Shell Shock sur CGI
[Python] J'ai écrit la route du typhon sur la carte en utilisant le folium
J'ai étudié le mécanisme de connexion flask!
J'ai étudié avec Kaggle Start Book basé sur kaggle [Partie 1]
J'ai vérifié l'image de l'Université des sciences sur Twitter avec Word2Vec.
J'ai essayé de mesurer le temps d'attente de la file d'attente d'exécution d'un processus sous Linux
J'ai vérifié le contenu du volume du docker
J'ai essayé le serveur asynchrone de Django 3.0
J'ai vérifié les options de copyMakeBorder d'OpenCV
Étudiez l'effet des valeurs aberrantes sur la corrélation
La structure des dossiers de Flask est résumée
Je suis tombé sur l'API Hatena Keyword
Publier le sujet de Gmail sur Twitter
Je ne connaissais pas les bases de Python
Afficher le graphique de tensorBoard sur Jupyter
Le modèle de projet Python auquel je pense.
Changer l'ordre de PostgreSQL dans Heroku
Je souhaite utiliser Python dans l'environnement de pyenv + pipenv sous Windows 10
J'ai installé Pygame avec Python 3.5.1 dans l'environnement de pyenv sur OS X
J'ai joué à Ruina du RPG Tsukuru 2000 ~ The Story of the Abandoned City ~ sur Raspberry Pi
J'ai essayé la détection d'objets avec YOLO v3 (TensorFlow 2.1) sur le GPU de windows!
J'ai essayé de récupérer les données de l'ordinateur portable en le démarrant sur Ubuntu
J'ai essayé d'afficher le degré d'infection par le virus corona sur la carte thermique Seaborn
J'ai essayé la fonction de tableau croisé dynamique des pandas
J'ai essayé l'analyse par grappes de la carte météo
J'ai lu l'implémentation de range (Objects / rangeobject.c)
J'ai résolu le problème le plus profond d'Hiroshi Yuki.
Le comportement de signal () dépend de l'option de compilation
[2020July] Vérifiez l'UDID de l'iPad sous Linux
Utilisez la dernière version de PyCharm sur Ubuntu
J'ai vérifié la liste des touches de raccourci de Jupyter
J'ai essayé de corriger la forme trapézoïdale de l'image
Essayez Progate Free Edition [Python I]
J'ai vérifié la période de rétention de session de django
J'ai vérifié la vitesse de traitement de la numpy unidimensionnelle
J'ai touché certaines des nouvelles fonctionnalités de Python 3.8 ①
Calculer la probabilité de valeurs aberrantes sur les moustaches de la boîte
J'ai couru le réseau neuronal sur le FPGA réel
Au moment de la mise à jour de python avec ubuntu
Changer la résolution d'Ubuntu s'exécutant sur VirtualBox
J'ai lu et implémenté les variantes de UKR
Je souhaite personnaliser l'apparence de zabbix
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé de jouer avec la calculatrice avec tkinter
[AWS S3] Confirmation de l'existence de dossiers sur S3
J'ai fait un peu de recherche sur la classe
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
[Exemple d'amélioration de Python] Apprentissage des bases de Python sur un site gratuit en 2 semaines
J'ai créé l'interface du tableau de bord de l'hôpital qui affiche les données cliniques sur la page Web.
Je veux tracer les informations de localisation de GTFS Realtime sur Jupyter! (Avec ballon)
Je souhaite prendre une capture d'écran du site sur Docker en utilisant n'importe quelle police
J'ai essayé de faciliter la modification du paramètre du proxy authentifié sur Jupyter