CVE-2020–15227: Chyba potenciálně umožňující vzdálené spuštění kódu

David Grudl
Nette Core | 7239
+
+7
-

Aktualizujte prosím kvůli objevené zranitelnosti co nejdříve na nejnovější setinkové verze:

nette/application 3.0.6 (případně 3.0.2.1, 3.1.0-RC2 nebo dev)
nette/application 2.4.16
nette/application 2.3.14
nette/application 2.2.10
nette/nette 2.1.13
nette/nette 2.0.19

ps: pár postřehů ze zákulisí

Aktualizace pomocí Composeru

Obvykle stačí v projektu zavolat composer update a stáhnou se aktuální verze všech balíčků. Pro aktualizaci jen konkrétního balíčku použijte např. composer update nette/application.

Jakou máte nainstalovanou verzi jednotlivých balíčků zjistíte příkazem composer show.

Pozor, Composer je potřeba spustit se stejnou verzí PHP, jako je na hostingu, nebo doplnit verzi do composer.json, viz dokumentace.

Aktualizace stažením balíčku

Pokud místo Composeru používáte distribuční balíčky, můžete si je stáhnout z archivu.

Nejrychlejší oprava

Michal Špaček připravil Linuxový skript (+ obdoba v PHP), který automaticky aplikuje patch přímo do zdrojových kódů Nette na disku. Hodí se v případě, že udržujete velké množství projektů, které nemáte prostor korektně aktualizovat pomocí Composeru.

Dirty fix

Smažte soubor MicroPresenter.php.

filsedla
Člen | 91
+
0
-

Ahoj, zajímalo by mě, nutilo tě něco to zveřejnit? Nebo, zvažoval jsi, že to nezveřejníš vůbec?

Mám nette rád, ale bojím se, že úplně celá nette komunita není tak pružná, lidi to neaktualizujou, a někdo to začne hackovat ve velkém :-(

ppar
Backer | 326
+
-9
-

Co jsem pochopil, tak jsou postoženi aplikace, které používají simple rtouter, pokud ne, tak vš je zabezpečené.

Editoval ppar (4. 10. 20:13)

fizzy
Backer | 48
+
+1
-

ppar napsal(a):

Co jsem pochopil, tak jsou postoženi aplikace, které používají simple rtouter, pokud ne, tak vš je zabezpečené.

nie je to celkom tak, postihnute je dost velke mnozstvo aplikacii, urcite treba zaktualizovat spominany package, sam som bol prekvapeny kolko mojich projektov bolo zranitelnych

Roman Halaxa
Člen | 57
+
+4
-

filsedla napsal(a):

Ahoj, zajímalo by mě, nutilo tě něco to zveřejnit? Nebo, zvažoval jsi, že to nezveřejníš vůbec?

Mám nette rád, ale bojím se, že úplně celá nette komunita není tak pružná, lidi to neaktualizujou, a někdo to začne hackovat ve velkém :-(

Upřímně tvůj podnět nechápu. Ty by jsi navrhoval chybu tiše opravit, nedat to nikomu vědět a doufat, že všichni zaktualizují dřív než na to někdo příjde a zaůtočí na ně? To mi příjde maličko zcestné. Myslím že situace byla zvládnutá jak nejlépe mohla být.

David Grudl
Nette Core | 7239
+
+7
-

filsedla napsal(a):

Ahoj, zajímalo by mě, nutilo tě něco to zveřejnit? Nebo, zvažoval jsi, že to nezveřejníš vůbec?

Myslíš variantu, že bych tiše vydal patch jen pro verze 3.0 a 2.4 a domluvil se s objevitelem, aby o chybě nikomu neříkal a nezneužil ji a sám bych ji zveřejnil třeba až po dvou letech, kdy už vyvíjené projekty patch budou mít přirozeně aplikovaný. A třeba přitom bych vydal i patche pro staré verze Nette.

Tento scénář má slabé místo v tom, že člověka, co chybu objevil, vůbec neznám a nevím jaké má záměry. A taky chybu může objevit někdo další a ten ji vůbec nebude reportovat.

Kdybych chybu nezveřejnil, nesl bych za její případné zneužití odpovědnost, což bych fakt nechtěl.

filsedla
Člen | 91
+
0
-

Především fakt doufám, že to funguje tak, že před odpovědností za zneužití chyb v kódu autora chrání licence.

David Grudl
Nette Core | 7239
+
0
-

Měl jsem na mysli morální zodpovědnost. Právní žádný autor open source nemá, protože každá licence obsahuje odstavec o zřeknutí se odpovědnosti za případné vady či chyby.

filsedla
Člen | 91
+
-1
-

To je dobře.

Myslím si, že bylo určitě dobré opravit všechny verze a nějak o tom říct, ale je to užitečné jenom pro ty, kteří aktualizují.

Co ty, co ne? Kolik je webů s nette v nějaké neaktualizovatelné formě, webů, co jsou online, ale nestará se o ně žádný programátor apod.?

Lidé o chybě třeba nic neprozradí, ale přijde mi, že i ten samotný CVE report je příliš dobrý návod – pro zahraniční hackery obzvlášť, udělají tady z těch webů botnet.

dakur
Člen | 99
+
+13
-

@filsedla Každý správce stránek je zodpovědný za to, aby udržoval systém aktuální. Pokud to nedělá, protože je lajdák, je to jeho zodpovědnost, pokud to nedělá, protože mu to provozovatel nezaplatí, je to problém provozovatele a nemůže si pak stěžovat. David nemůže zachránit všechny, souhlasím, že udělal, co mohl, koneckonců takový je standardní postup ohledně zveřejňování zranitelností po celém světě. 🙂

Editoval dakur (6. 10. 8:40)

filsedla
Člen | 91
+
-10
-

@dakur Pak je to jeden ze standardních postupů v dnešním světě, který ho vlastně ničí. Už chápu, co je za celou tou update-manií.

Pavel Kravčík
Člen | 995
+
+1
-

@filsedla – Github třeba automaticky upozorňuje majitele balíčků na závislosti, které mají známou chybu. Je to hodně podobné klasické evoluci – věci které zastarají nebo ustrnou – čeká konec.

Pokud Tě o tom zajímá víc, je dobré projet třeba blogy o Wordpressu, aktualizacích, zranitelnostích, robotech.

David Grudl
Nette Core | 7239
+
+12
-

To co nazýváš update-manií je nutnost udržovat všechny projekty neustále na aktuálních verzích, což stojí úsilí a peníze, i když se projekt dál už nevyvíjí. A je to pochopitelně docela nepříjemná nutnost.

Právě proto jsem vydal aktualizace i osm let starých verzí, aby bylo možné snadno opravit také weby, kde už je technologický dluh.

dakur
Člen | 99
+
0
-

@filsedla „Update mánie“ je logický důsledek využívání open-source – aktualizuješ kvůli novinkám i kvůli bezpečnosti. Ano, musíš se drbat s updaty, ale máš za to plno dobrých knihoven, které bys jinak neměl a lidi by pořád dokolečka psali všechno znova a pořád by v tom dělali základní chyby.

Alternativou je closed-source, kde nemusíš aktualizovat nic, ale zase nemáš knihovny a zatímco ty odhalíš menší část svých chyb, tak hackeři možná větší. 🙂

Ale ony ani updaty nemusí být mánie. Prostě aktualizuješ celý projekt jednou za měsíc a je to. ✅

Editoval dakur (6. 10. 15:23)

Felix
Nette Core | 1040
+
0
-

dakur napsal(a):
Ale ony ani updaty nemusí být mánie. Prostě aktualizuješ celý projekt jednou za měsíc a je to. ✅

Ja aktualizuju kazdy tyden. Bere mi to 10–60m. Vsichni jsou happy, i ja jsem happy.

Lukes
Člen | 65
+
0
-

Zdravím všechny,

důrazně doporučuji aktualizovat, protože dnes ráno se na naší službě už někdo zkoušel chybu zneužít. Někdo z Hong Kongu podle IP.

(url zamaskovana moderatorem)
Nette\InvalidStateException

Parameter callback is not a valid closure.

Je pravda, že naše služba je poměrně více exponovaná různým hackerům, ale tady vidíte, že to není sranda.

Jen bych chtěl podotknout, že jsem Nette aktualizoval ještě dříve, než to tu @DavidGrudl vystavil.

Editoval Lukes (10. 10. 11:12)

David Matějka
Moderator | 6275
+
+2
-

@Lukes ahoj, prosim nepis presnou URL

Lukes
Člen | 65
+
0
-

David Matějka napsal(a):

@Lukes ahoj, prosim nepis presnou URL

Pravda omlouvám se…

David Matějka
Moderator | 6275
+
+11
-

Jinak ještě doplním pro ostatní nějaký info:

  • možná jste se koukali na ten fix a říkali jste si, že se vás to netýká, jelikož tu feature nepoužíváte. týká se to i vás, chyba umožňuje zneužití této feature
  • možná jste si říkali, že by se vás to týkalo, ale naštěstí používáte nějakou feature, co vás vlastně zachrání (nebudu zmiňovat). týká se to možná i vás, v nette je zas jiná feature, která ještě eskaluje možnost zneužití této chyby
  • na vzorku webů, kde jsem chybu zkoušel, tak na základní vektor útoku je stále náchylných asi 15% webů. situace se o pár procent zlepšila, ale furt je to špatný. na pokročilý vektor útoku může být zranitelných mnohem víc webů
  • útok umožní provedení jakéhokoliv php kódu, tedy i převzetí webu, stáhnutí zdrojaků nebo odcizení databáze
  • nespoléhejte, že se vás to netýká. aktualizujte
  • jak vypadá ta URL objevuje čím dál víc lidí. je jen otázkou času, než někdo začne dělat plošné útoky
spaze
Generous Backer | 27
+
+8
-

Chtěl bych jen upozornit, že od včerejšího odpoledne (cca 14 UTC) je k dispozici zdrojový kód (Proof of Concept, PoC), který chybu zneužívá a snaží se útočníkovi poskytnout „shell“ – tedy jednoduchou možnost „ovládat“ server. Odkaz na ten kód už se podle všeho začal šířit kamsi do Asie, ale tohle je Internet, takže jestli je to v Asii nebo Tramtárii je úplně jedno :-) Na základě toho kódu lze jednoduše vytvořit nový kód, který bude třeba jen stahovat konfiguráky apod.

Prosím, aktualizujte, opravdu, ostatně viz příspěvek Davida nademnou.

Gappa
Nette Blogger | 147
+
0
-

Ahoj,

potvrzuji pokus o zneužití na jednom z webů – včera a dnes ráno, naštěstí neúspěšný.

romanm
Člen | 20
+
+2
-

Po potvrzení, že se jedná o danou URL potvrzuji dnes ráno také návštěvu z IP 192.95.30.59 (OVH). Jedná se o web, který nikde není indexovaný – interní appka pro tři lidi, sem tam to navštíví roboti, ale je tam klasický auth.

Takže pro ostatní: šup šup aktualizovat, včera byla pozdě

David Grudl
Nette Core | 7239
+
+4
-

Michal Špaček připravil Linuxový skript, který automaticky aplikuje patch přímo do zdrojových kódů Nette na disku. Hodí se v případě, že udržujete velké množství projektů, které nemáte čas korektně aktualizovat pomocí Composeru.

Funguje to se všemi postiženými verzemi Nette, tedy od v2.0.0

Pokud nemáte Linux, použijte obdobu v PHP.

Spock
Člen | 8
+
0
-

Při aktualizaci z „nette/nette“: „2.2.9“ na „2.2.10“ to háže:
`[RuntimeException]
Could not load package nette/caching in http://packagist.org: [UnexpectedValueException] Could not parse version constraint ^v3.0.0-beta2: Invalid version string „^v3.0.0-beta2“`

Zkoušel jsem i „nette/application“, ale to samé. Nedělili se v té verzi 2.2 ty balíčky nebo tak něco?
U starších aplikací ručo na nette/nette 2.0.19 a přes composer na nette/nette 2.1.13 v pohodě.
U 3.0 samozřejmě taky v pohodě. :-)

Už jsem zaznamenal na některých projektech pokusy o zneužití.

David Grudl
Nette Core | 7239
+
0
-

Nemám tušení, odkud se to ^v3.0.0-beta2 bere, ale občas taky narazím na nepochopitelné chování a někdy pomůže smazat composer.lock + vendor a nainstalovat všechno znova.

H0w4rd
Člen | 80
+
0
-

Potvrzuju, na jednom starsim projektu jsem mel Nette 2.2.7.

Composer update nette/nette odmital cokoliv udelat, tvaril se, ze vse je aktualni.

Kdyz jsem dal remove a pak composer require nette/nette:2.2.14 nebo composer require “nette/nette:<2.3”, skoncilo to divnou chybou

Problem 1
    - don't install nette/nette v2.2.14|remove nette/deprecated v2.4.2
    - don't install nette/nette v2.2.14|don't install nette/deprecated v2.4.2
    - don't install nette/nette v2.2.14|don't install nette/deprecated v2.4.2
    - Installation request for nette/nette 2.2.14 -> satisfiable by nette/nette[v2.2.14].
    - Installation request for nette/deprecated (locked at v2.4.2) -> satisfiable by nette/deprecated[v2.4.2].

Musel jsem smazat composer.lock a dat composer update.
Ted je to ok.
Diky za opravu.

Editoval H0w4rd (14. 10. 14:15)

ppar
Backer | 326
+
0
-

Ahoj, koukal jsem do logů neaktulizovaných aplikaci:

5.101.156.177 - - [14/Oct/2020:18:14:49 +0200] "GET ...=ifconfig HTTP/1.1" 301 5206
5.101.156.177 - - [14/Oct/2020:18:14:49 +0200] "GET ...=ifconfig HTTP/1.1" 404 13193

Byl jsem ochráněn? Nebo mám zkoumat všechny logy, co mi tam udělal?

David Matějka
Moderator | 6275
+
0
-

@ppar ahoj, určitě aktualizuj. sice asi není aplikace zranitelná na té hlavní adrese, ale může být zranitelná jinudy.

LucieK
Člen | 2
+
0
-

Ahoj, dobrý den.
Dostala jsem dnes varovné maily od poskytovatele hostingu, že na obou mých webech se nachází neaktualizovaný PHP framework Nette obsahující kritickou zranitelnost CVE-2020–15227, která umožňuje spouštět útočníkovi svůj kód. Kontaktovala jsem jejich podporu, ale oni o tom nic neví a neumí poradit.
Jsem laik, web mám na wordpressu s hostingem u wedosu a vůbec netuším, kde a jak poznám, že se mě to skutečně týká. Natož jak to opravit. Můžete mě, prosím, nasměrovat?

Přiznávám, že místní řeči v kódech vůbec nerozumím :-)

serga
Člen | 1
+
0
-

Ahoj,

je Nette-2.4–20201001.zip, která je ke stáhnutí, už opravená? Podle kalendářního data mi příjde, že by měla, raději se ještě ptám. Composer bohužel na tomto projektu, který mám opravit, nelze :(

Díky

Editoval serga (4. 11. 22:19)

LucieK
Člen | 2
+
+1
-

Vyřešeno s autorem šablony na WP, kterou používám.

LucieK napsal(a):

Ahoj, dobrý den.
Dostala jsem dnes varovné maily od poskytovatele hostingu, že na obou mých webech se nachází neaktualizovaný PHP framework Nette obsahující kritickou zranitelnost CVE-2020–15227, která umožňuje spouštět útočníkovi svůj kód. Kontaktovala jsem jejich podporu, ale oni o tom nic neví a neumí poradit.
Jsem laik, web mám na wordpressu s hostingem u wedosu a vůbec netuším, kde a jak poznám, že se mě to skutečně týká. Natož jak to opravit. Můžete mě, prosím, nasměrovat?

Přiznávám, že místní řeči v kódech vůbec nerozumím :-)

spaze
Generous Backer | 27
+
+1
-

@serga Ahoj, ano v https://files.nette.org/…20201001.zip je to opravené.

ppar
Backer | 326
+
0
-

ppar napsal(a):

Ahoj, koukal jsem do logů neaktulizovaných aplikaci:

5.101.156.177 - - [14/Oct/2020:18:14:49 +0200] "GET ...=ifconfig HTTP/1.1" 301 5206
5.101.156.177 - - [14/Oct/2020:18:14:49 +0200] "GET ...=ifconfig HTTP/1.1" 404 13193

Byl jsem ochráněn? Nebo mám zkoumat všechny logy, co mi tam udělal?

Odpovím si sám – pokud aplikace používá u každé routy modul, tak vše je OK:

Nette\Application\BadRequestException #404
Cannot load presenter 'Front:Nette:Micro', class 'App\FrontModule\NetteModule\Presenters\MicroPresenter' was not found.
<?php
declare(strict_types=1);

namespace App\Router;

use Nette;
use Nette\Application\Routers\RouteList;

final class RouterFactory
{

	use Nette\StaticClass;

	public static function createRouter(): RouteList
	{
		$router = new RouteList;

		$router->addRoute('[<locale=cs cs|en>/]admin[/<presenter>[/<action>[/<id>]]]', [
			'module' => 'Admin',
			'presenter' => 'Homepage',
			'action' => 'default'
		]);

		$router->addRoute('[<locale=cs cs|en>/]<presenter>[/<action>[/<id>]]', [
			'module' => 'Front',
			'presenter' => 'Homepage',
			'action' => 'default'
		]);
		//pokud je nějaká routa bez modulu, aplikace je zranitelná
        //$router->addRoute('<presenter>/<action>', 'Homepage:default');
		return $router;
	}
}

Testováno na Nette 3

Editoval ppar (16. 10. 16:40)

spaze
Generous Backer | 27
+
+1
-

ppar napsal(a):

Odpovím si sám – pokud aplikace používá u každé routy modul, tak vše je OK:

Mám každou routu v modulu a přesto aplikace byla zranitelná. Rozdíl jsem našel ten, že moduly uvádím pomocí withModule() místo klíče module v poli $metadata např. takto:

		$router->withModule('Front');
		$router->addRoute('[<locale=cs cs|en>/]<presenter>[/<action>[/<id>]]', [
			'presenter' => 'Homepage',
			'action' => 'default'
		]);
David Matějka
Moderator | 6275
+
+4
-

ok, tak když už je prozrazen bod

možná jste si říkali, že by se vás to týkalo, ale naštěstí používáte nějakou feature, co vás vlastně zachrání (nebudu zmiňovat). týká se to možná i vás, v nette je zas jiná feature, která ještě eskaluje možnost zneužití této chyby

tak to můžu popsat konkrétněji – jestli používáte moduly přes RouteList, tak vás to neochrání, jelikož nette neprefixne vámi definovaný modul, pokud je to požadavek na Nette modul (a tedy i na Nette:Micro)

zavedl to tento commit: https://github.com/…0665c85589d2

Allconius
Člen | 175
+
0
-

David Matějka napsal(a):

@Lukes ahoj, prosim nepis presnou URL

Ahoj já jsem aktualizoval 5.10. na v3.0.6 a 14.10. už jsem tam měl exception „Parameter callback is not a valid closure.“ Pokud je to v exception tak se útok nepovedl předpokládám :-)

pista5
Člen | 13
+
0
-

Ahoj, mam 2 projekty… jeden bezel na Nette 3.0.4, druhy na 3.0.2

Po spusteni composer update mi prvni spravne updatnul nette/application na 3.0.6, ale druhy pouze na 3.0.2.1

Nechapu proc?

David Matějka
Moderator | 6275
+
+1
-

@pista5 ahoj, v nette/application 3.0.3 a 3.0.4 doslo k aktualizaci nejakych zavislosti (konkretne nette/utils a latte) a tak David jeste vydal 3.0.2.1, ktera je taky opravena a nevyzaduje dalsi aktualizace. muzes ale zkusit spustit composer update nette/application --with-dependencies. ale jestli se nepletu, tak asi v latte byl nejaky bc break…

kazdopadne ta 3.0.2.1 je bezpecna

David Grudl
Nette Core | 7239
+
+2
-

Ano, v3.0.2.1 je fixnuta. Existuje kvůli tomu, když se nemůže z nějakých důvodů nainstalovat nette/utils 3.1, což pak brání instalaci nette/application 3.0.6

Lukes
Člen | 65
+
0
-

Allconius napsal(a):

David Matějka napsal(a):

@Lukes ahoj, prosim nepis presnou URL

Ahoj já jsem aktualizoval 5.10. na v3.0.6 a 14.10. už jsem tam měl exception „Parameter callback is not a valid closure.“ Pokud je to v exception tak se útok nepovedl předpokládám :-)

Jojo to znamená, že se nepovedl ;-)

spaze
Generous Backer | 27
+
+9
-

Sepsal jsem pár věcí, který když využijete, tak vás podobný chyby (nejen v Nette) nenachytají na švestkách a dozvíte se o nich včas a automaticky a můžete snížit dopad příp. úspěšného útoku:

  • Dependabot na GitHubu
  • Balíček roave/security-advisories
  • Tak trochu i PHPStan
  • Úprava konfigurace PHP (disable_functions)
  • Podpora vývojářů 💲

Všechno z toho využívám, v článku jsou odkazy na příklady a konkrétní soubory.

filsedla
Člen | 91
+
0
-

Ahoj. Díky aktualizaci se útok nejspíš neprovádí, logy mi však pořád zahlcuje chyba

PHP User Warning: Case mismatch on presenter name 'Nette:Micro', correct name is 'NetteModule:Micro'. in ...\vendor\nette\application\src\Application\PresenterFactory.php:86

Jak se toho zbavím? Nebo je to normální (že útok zanechává takovou stopu)?

Jsem na aktualizovaném nette 2.4

David Grudl
Nette Core | 7239
+
0
-

@filsedla netuším, jak taková věc vzniká, máš nějaké bližší info?

filsedla
Člen | 91
+
+1
-

@DavidGrudl Jo. Je to nějaká zvláštní interakce strohého mappingu s tím napovídačem. Dá se to poměrně snadno nasimulovat, asi na jakémkoliv projektu, třeba web-project, nastavíš mapping

application:
	mapping:
		*: *\*Presenter

a zadáš URL na nette micro.

David Grudl
Nette Core | 7239
+
+2
-

Hmm, fixed.

filsedla
Člen | 91
+
+1
-

@DavidGrudl Díky