Závažná vzdálená zranitelnost v DNS serveru NSD

Kolegové z vývojového týmu Knot DNS se kromě vývoje také velmi pečlivě věnují testování, kterým se snažíme odhalit jednak chyby v samotném kódu našeho serveru, ale také odchylky od „standardu“ s důrazem na interoperabilitu jednotlivých serverů. Píši „standard“ DNS s uvozovkami, jelikož se jedná o souhrn dokumentů, které jsou někdy velmi nejasné, a jejich výklad záleží spíš na dohodě celého DNS ekosystému.

V rámci tohoto testování kolegové z Laboratoří CZ.NIC připravují také sadu DNS dotazů, které jsou nestandardní a zjišťují chování vybraných open-source DNS serverů (Bind 9, NSD 3,…). Jeden z uměle vytvořených testů, které připravili mí kolegové Marek Vavruša a Ľuboš Slovák, za TSIG podpis DNS zprávy připojoval další prázdný RR záznam (konkrétně prázdný TXT záznam). Při testování se ukázalo, že NSD ve všech verzích 3.x (i vývojové verzi 4.x) obsahuje zranitelnost, která je zneužitelná pro pád DNS serveru z libovolného místa v Internetu. Při přijmutí takové DNS zprávy dojde k dereferenci NULL pointru a NSD spadne s chybou SIGSEGV.

Tento problém jsme kolegům z NLnet Labs nahlásili v pondělí krátce po poledni a hned další den ráno jsme měli v poště opravný patch, který přikládám na konec tohoto blogpostu. V době vydání tohoto blogpostu by také na stránkách NSD měla být k dispozici verze 3.2.12, která tento bezpečnostní problém opravuje.

Jelikož se jedná o vzdálenou zranitelnost, na kterou neexistuje žádný workaround, důrazně doporučujeme v případě, že používáte NSD 3, okamžitě záplatovat vaše DNS servery.

Patch:

--- query.c (revision 3609)
+++ query.c (working copy)
@@ -1379,6 +1379,9 @@
edns = &nsd->edns_ipv6;
}
#endif
+ if (RCODE(q->packet) == RCODE_FORMAT) {
+ return;
+ }
switch (q->edns.status) {
case EDNS_NOT_PRESENT:
break;

Ondřej Surý

Autor:

Zanechte komentář