Auteur Sujet: La faille «Shellshock» de Bash  (Lu 13307 fois)

0 Membres et 1 Invité sur ce sujet

corrector

  • Invité
Sécurité: la mégafaille «Shellshock» secoue le monde Linux et Mac OS
« Réponse #36 le: 28 septembre 2014 à 19:28:04 »
Haha
Ok.
Prenons un exemple bateau. Tu sais lire le PHP ?
Code: ("php") [Sélectionner]
$query = "select * from machin where bidule = $_GET['bidule']";
mysql_query(bidule truc machin chose);

Ce code est mauvais.
Est-ce la faute de PHP ?
Est-ce que la doc de PHP permet de prévoir ça?

Mieux, est-ce qu'une vache parfaitement sphérique fait du lait? Combien?
« Modifié: 29 septembre 2014 à 00:34:43 par corrector »

corrector

  • Invité
Sécurité: la mégafaille «Shellshock» secoue le monde Linux et Mac OS
« Réponse #37 le: 28 septembre 2014 à 19:36:00 »
Heu... non, ça passe pas. Pas plus qu'en proprio , et sur ce sujet je suis d'accord avec Marin.
Après, la seule question, c'est qu'un code de cochon, dans le monde libre, on va te répondre : "retrousse-toi les manches et envoie des patchs" (Ce qui revient à dire "va te faire foutre" à 99.99% des utilisateurs du programme, je suis bien d'accord).
Non, on va te dire que c'est normal et attendu. Je l'ai vu plein de fois de la part de petit merdeux qui répète ce qu'il a entendu dans un forum :
- machin ne marche pas en multithread : c'est normal les threads ne sont pas conformes ANSI C
- truc casse le programme : c'est normal cet usage est interdit par xxxx
- "ça marchait par accident"
- "c'est un mauvais style de programmation, normal que ça casse"

On voit ça tout le temps.

Exemple de ce genre de ramassis de conneries par un bouffon ignorant et prétentieux qui cite une norme auquel il ne comprend rien :

"An object shall have its stored value accessed only by an lvalue
expression that has one of the following types: ...  an aggregate
or union type that includes one of the aforementioned types among its
members (including, recursively, a member of a subaggregate or
contained union), or ..."

doesn't mean that you can get such an aggregate or union lvalue by

  union u { int x; } *pu = (union u*)&i;

because the rules about pointer conversions only allow the result of

  (union u*)&i

to be converted back to an (int*).  They do not allow you to dereference
that pointer as a (union u*):

"6.3.2.3

"A pointer to an object or incomplete type may be converted to a
pointer to a different object or incomplete type. If the resulting
pointer is not correctly aligned for the pointed-to type, the
behavior is undefined. Otherwise, when converted back again, the
result shall compare equal to the original pointer."

This is *all* you are allowed to do with the converted pointer.  You
may not dereference it.

This is the core rule that governs C's aliasing.

Andrew.

https://gcc.gnu.org/ml/gcc/2010-01/msg00031.html

C'est signé "Andrew Haley <aph at redhat dot com>"

RedHat emploie des types de ce calibre.

(Je ne dis pas que M$ n'emploie pas des bouffons au service réclamation.)

vivien

  • Administrateur
  • *
  • Messages: 47 213
    • Twitter LaFibre.info
Sécurité: la mégafaille «Shellshock» secoue le monde Linux et Mac OS
« Réponse #38 le: 29 septembre 2014 à 09:43:49 »
J'ai supprimé toutes les attaques et messages hors sujet.

Vu les nombreux dérapages, je bloque le sujet [édit : ré-ouvert].

Copie d'écran du correctif pour Ubuntu :

corrector

  • Invité
Des nouvelles sur la fonctionnalité "() {" de bash
« Réponse #39 le: 01 octobre 2014 à 02:53:54 »
(Merci aux trolls de ne pas pourrir ce topic)

September 27, 2014
Bash bug: apply Florian's patch now (CVE-2014-6277 and CVE-2014-6278)
OK, rebuild bash and deploy Florian's unofficial patch or its now-upstream version now. If you're a distro maintainer, please consider doing the same.
My previous post has more information about the original vulnerability (CVE-2014-6271). It also explains Tavis' and my original negative sentiment toward the original upstream patch. In short, the revised code did not stop bash from parsing the code seen in potentially attacker-controlled, remotely-originating environmental variables. Instead, the fix simply seeks to harden the parsing to prevent RCE. It relies on two risky assumptions:
That spare for this one bug we're fixing now, the process of parsing attacker-controlled functions is guaranteed to have no side effects on the subsequently executed trusted code.
That the underlying parser, despite probably not being designed to deal with attacker-supplied inputs, is free from the usual range of C language bugs.
From the very early hours, we have argued on the oss-security mailing list that a more reasonable approach would be to shield the parser from remotely-originating strings. I proposed putting the function export functionality behind a runtime flag or using a separate, prefixed namespace for the exported functions - so that variables such as HTTP_COOKIE do not go through this code path at all. Unfortunately, we made no real progress on that early in the game.
Soon thereafter, people started to bump into additional problems in the parser code. The first assumption behind the patch - the one about the parsing process not having other side effects - was quickly proved wrong by Tavis, who came up with a code construct that would get the parser in an inconsistent state, causing bash to create a bogus file and mangle any subsequent code that /bin/sh is supposed to execute.
This was assigned CVE-2014-7169 and led to a round of high-profile press reports claiming that we're still doomed, and people assigning the new bug CVSS scores all the way up to 11. The reality was a bit more nuanced: the glitch demonstrated by Tavis' code is a bit less concerning, because it does not translate into a universally exploitable RCE - at least not as far as we could figure it out. Some uses of /bin/sh would be at risk, but most would just break in a probably-non-exploitable way. The maintainer followed with another patch that locked down this specific hole.
The second assumption started showing cracks, too. First came a report from Todd Sabin, who identified an off-by-one error when parsing more than ten stacked redirects. The bug, assigned CVE-2014-7186, would cause a crash, but given the nature of the underlying assignment, it wasn't particularly clear if this created an immediately exploitable security risk. Another similarly ambiguous one-off issue with line counting in loops cropped up shortly thereafter (CVE-2014-7187).
The two latter issues do not have an officially released upstream patch at that point, but they prompted Florian Weimer of Red Hat to develop an unofficial patch that takes a seemingly more durable approach that we argued for earlier on: putting function exports in a separate namespace. Florian's fix effectively isolates the function parsing code from attacker-controlled strings in almost all the important use cases we can currently think of.
(One major outlier would be any solutions that rely on blacklisting environmental variables to run restricted shells or restricted commands as a privileged user - sudo-type stuff - but it's a much smaller attack surface and a a very dubious security boundary to begin with.)
Well... so, to get to the point: I've been fuzzing the underlying function parser on the side - and yesterday, bumped into a new parsing issue (CVE-2014-6277) that is almost certainly remotely exploitable and made easier to leverage due to the fact that bash is seldom compiled with ASLR. I'll share the technical details later on; for now, I sent the info to the maintainer of bash and to several key Linux distros. In general terms, it's an attempt to access uninitialized memory leading to reads from, and then subsequent writes to, a pointer that is fully within attacker's control. Here's a pretty telling crash:
bash[3054]: segfault at 41414141 ip 00190d96 ...
Soon after posting this entry, I also bumped in the sixth and most severe issue so far, essentially permitting very simple and straightforward remote code execution (CVE-2014-6278) on the systems that are patched against the first bug. It's a "put your commands here" type of a bug similar to the original report. I will post additional details in a couple of days to give people enough time to upgrade.
At this point, I very strongly recommend manually deploying Florian's patch unless your distro is already shipping it. (Florian's patch has been also finally included upstream shortly after I first posted this entry.)
From within the shell itself, the simplest way to check if you already have it installed would be:
foo='() { echo not patched; }' bash -c foo
If the command shows "not patched", you don't have the patch and you are still vulnerable to a (currently non-public) RCE, even if you applied the original one (or the subsequent upstream patch that addressed the issue found by Tavis).
Oh, and if it shows "command not found", you're good.


http://lcamtuf.blogspot.ro/2014/09/bash-bug-apply-unofficial-patch-now.html

COMMENTAIRE

Il va de soi que je suis d'accord sur le fait de supprimer la fonctionnalité "() {" de bash, à la base de la faille-scandale "shellshock".

obinou

  • AS197422 Tetaneutral.net
  • Expert
  • *
  • Messages: 1 668
  • Montgesty (46150)
    • Tetaneutral.net
La faille «Shellshock» de Bash
« Réponse #40 le: 01 octobre 2014 à 09:08:10 »
Merci corrector.

J'avoue que j'ai suivi ça de loin, et j'ai tj pas compris comment c'était exploitable en remote sur un serveur qui ne fait pas tourner de CGI, ni comment on peut élever des privilèges avec. Dans le doute, j'ai patché . et ton dernier message m'a montré l'un de mes serveur non patché alors que je pensait que c'était fait, donc merci bcp !

corrector

  • Invité
La faille «Shellshock» de Bash
« Réponse #41 le: 01 octobre 2014 à 09:45:04 »
Il n'y a pas UNE mais une série de failles dans bash.

corrector

  • Invité
Les failles «Shellshock» de Bash
« Réponse #42 le: 01 octobre 2014 à 14:33:32 »
J'avoue que j'ai suivi ça de loin, et j'ai tj pas compris comment c'était exploitable en remote sur un serveur qui ne fait pas tourner de CGI, ni comment on peut élever des privilèges avec. Dans le doute, j'ai patché . et ton dernier message m'a montré l'un de mes serveur non patché alors que je pensait que c'était fait, donc merci bcp !
C'est exploitable quand un shell bash est lancé :
- explicitement : /bin/bash
- implicitement : /bin/sh pointant sur bash (mais pas sur Debian, puisque sh = dash)

ce que peut se produire :
- explicitement exec ("/bin/bash", blah)
- exec ("un-script") qui est un script #!/bin/bash
- implicitement notamment avec les commandes comme system et popen (par opposition à exec)

dans un contexte où le contenu d'une variable d'environnement est fourni par un tiers qui n'est pas autorisé à exécuter des commandes dans le contexte d'exécution du /bin/bash en question, par exemple :

via le réseau :
- client HTTP (User-agent fabriqué) lançant un programme en CGI sur le serveur (variables "HTTP_machinchose") => accès en tant qu'utilisateur "www" ou "apache"
- serveur DHCP (options DHCP) transmises à un script par le client => accès en tant qu'utilisateur root
- client SSH ayant la possibilité de login SSH mais pas d'exécution d'un shell (utilisateur restreint)
- envoi d'email (qmail avec une adresse destination fabriquée : accès avec les droits du "facteur")

en local :

potentiellement tout programme qui s'exécute avec des droits que tu ne peux pas obtenir régulièrement :
- tout programme Set-quelque chose (SUID, SGID, Set-capability)
- tout programme périodique (comme crontab)
- tout programme de gestion hotplug démarré quand tu branches un périphérique USB ou autre
(ce sont les programmes que tu ne peux pas installer une version perso en remplacement de la version du système)

qui lancerait un script bash de la façon décrite.

Je n'ai pas étudié la question; les programmes s'exécutant automatiquement peuvent être ou ne pas être vulnérables. Il est évident qu'étudier la question est un très gros boulot et qu'il faudrait étudier chaque variante de script dans chaque distrib.

Donc :
- sur serveur HTTP, les systèmes de "scripts" qui sont plus efficaces que CGI ne sont pas concernés : pour être plus efficaces ils ne lancent pas un "script CGI" à chaque requête HTTP donc les variables d'environnement ne peuvent pas être utilisé pour transmettre des informations venant de la requête HTTP;
- le client SSH qui a le droit de lancer un shell sur un serveur n'est pas concerné parce que tout le qu'il peut faire c'est exploiter bash pour exécuter le programme qu'il peut lancer normalement; tu ne peux pas élever tes privilèges avec l'exploit dans ce cas là : au moment où bash est lancé, les droits sont ceux de ton utilisateur SSH.

Pour étudier la question, je suggère d'instrumenter /bin/bash pour qu'il logue toute les utilisations qui ne sont pas un shell interactif.
« Modifié: 02 octobre 2014 à 00:36:21 par corrector »

corrector

  • Invité
Sécurité : la "feature" "() {" de bash
« Réponse #43 le: 01 octobre 2014 à 14:49:40 »
Ah ben maintenant que tout le monde a trouvé ma backdoor, ça va etre moins tranquille.....
Je pense que le terme est approprié!

Pour donner une analogie facile à comprendre, c'est comme si MySQL décidait que si dans une requête SQL quelconque la valeur d'un champs commence par "'(fun)" alors
- tout ce qui suit peut définir une fonction SQL (feature)
- et qu'en fait le code permette d'exécuter une requête SQL quelconque (bug)

alors toute personne ayant la possibilité de fabriquer le contenu d'un champs d'une requête SQL quelconque aurait un accès à la base avec les droits du programme : par exemple, je pense que tout utilisateur de ce forum contrôlerait parfaitement la base. Et même un utilisateur non enregistré.

Et la seule façon de se protéger a priori de ce type de "feature" serait d'encoder (mettons en base 64) ou de chiffrer intégralement les données textuelles des utilisateurs avant de les mettre en BDD.

Bien sûr a posteriori (une fois la feature annoncée sur FD) on peut filtrer la commande '(fun) mais si une version différente de MySQL décide qu'en fait la syntaxe est "()'" ou "'`$^*" on l'a dans l'baba!

corrector

  • Invité
Les failles «Shellshock» de Bash
« Réponse #44 le: 01 octobre 2014 à 15:03:18 »
- tout programme de gestion hotplug démarré quand tu branches un périphérique USB ou autre
(ce sont les programmes que tu ne peux pas installer une version perso en remplacement de la version du système)
J'ai trouvé ça :

Citer
Hotplug event variables:
========================

Every hotplug event should provide at least the following variables:

  ACTION
    The current hotplug action: "add" to add the device, "remove" to remove it.
    The 2.6.22 kernel can also generate "change", "online", "offline", and
    "move" actions.

  DEVPATH
    Path under /sys at which this device's sysfs directory can be found.

  SUBSYSTEM
    If this is "block", it's a block device.  Anything other subsystem is
    either a char device or does not have an associated device node.

The following variables are also provided for some devices:

  MAJOR and MINOR
    If these are present, a device node can be created in /dev for this device.
    Some devices (such as network cards) don't generate a /dev node.

    [QUESTION: Any reliable way to get the default name?]

  DRIVER
    If present, a suggested driver (module) for handling this device.  No
    relation to whether or not a driver is currently handling the device.

  INTERFACE and IFINDEX
    When SUBSYSTEM=net, these variables indicate the name of the interface
    and a unique integer for the interface.  (Note that "INTERFACE=eth0" could
    be paired with "IFINDEX=2" because eth0 isn't guaranteed to come before lo
    and the count doesn't start at 0.)

  FIRMWARE
    The system is requesting firmware for the device.  See "Firmware loading"
    below.
https://www.kernel.org/doc/pending/hotplug.txt

Les variables qui prennent des valeurs parmi un ensemble limité de symboles "add", "remove", "change", "online", "offline", "move" (variable ACTION) ne sont évidemment pas exploitables, ni celles qui sont des valeurs numériques (variables MAJOR et MINOR), ni celles qui contiennent un chemin complet donc commençant par "/" (variable DEVPATH).

BadMax

  • Client Free adsl
  • Expert
  • *
  • Messages: 3 481
  • Malissard (26)
La faille «Shellshock» de Bash
« Réponse #45 le: 03 octobre 2014 à 10:17:52 »
Chose intéressante : la manière dont les constructeurs jugent la faille.
Exemple: Cisco et F5
 - Cisco embarque une version de bash vulnérable dans NX-OS (pour les switches Nexus) -> des correctifs sont disponibles pour certaines versions (car toutes ne sont pas vulnérables). Ce qui est intéressant c'est que pour accèder à bash, il faut déjà etre connecté en ssh au matériel...
 - F5 embarque bash dans ses appliances BigIP. Je l'ai testé, la faille est présente. Mais pour F5, pas de correctif car pas vulnérable. Pourquoi ? Sans doute parce qu'ils ont estimé que puisqu'il faut etre connecté en ssh sur l'appliance, la faille ne présente aucun intéret.

corrector

  • Invité
La faille «Shellshock» de Bash
« Réponse #46 le: 03 octobre 2014 à 13:08:54 »
Il n'y a aucun service réseau autre que ssh?

BadMax

  • Client Free adsl
  • Expert
  • *
  • Messages: 3 481
  • Malissard (26)
La faille «Shellshock» de Bash
« Réponse #47 le: 03 octobre 2014 à 13:56:08 »
Sur F5, l'admin est distinct des interfaces de prod. Mais l'admin se fait aussi via une interface web en HTTPS.

Sur NX-OS, hormis SNMP, y'a pas grand chose de possible.

Donc l'un (F5) est plus exposé que l'autre (Cisco NX-OS) en apparence. Et pourtant sur l'évaluation des risques, c'est le contraire :)