CVE-2020–15227: Chyba potenciálně umožňující vzdálené spuštění kódu
- David Grudl
- Nette Core | 8217
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
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
.
- Petr Parolek
- Člen | 455
Co jsem pochopil, tak jsou postoženi aplikace, které používají simple rtouter, pokud ne, tak vš je zabezpečené.
Editoval ppar (4. 10. 2020 20:13)
- fizzy
- Backer | 49
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 | 60
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 | 8217
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.
- David Grudl
- Nette Core | 8217
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 | 101
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 | 493
@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. 2020 8:40)
- Pavel Kravčík
- Člen | 1194
@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 | 8217
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 | 493
@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. 2020 15:23)
- Lukes
- Silver Partner | 68
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. 2020 11:12)
- David Matějka
- Moderator | 6445
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 | 28
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.
- romanm
- Člen | 27
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 | 8217
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
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 | 8217
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 | 96
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. 2020 14:15)
- Petr Parolek
- Člen | 455
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 | 6445
@ppar ahoj, určitě aktualizuj. sice asi není aplikace zranitelná na té hlavní adrese, ale může být zranitelná jinudy.
- LucieK
- Člen | 2
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 :-)
- LucieK
- Člen | 2
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 :-)
- Petr Parolek
- Člen | 455
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. 2020 16:40)
- spaze
- Generous Backer | 28
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 | 6445
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
- David Matějka
- Moderator | 6445
@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 | 8217
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
- Silver Partner | 68
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 | 28
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 | 101
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