Jak jsme chránili weby našich zákazníků před kritickou chybou ve WordPress pluginu ThemeGrill Demo Importer

[gtranslate]

V pondělí 17.02.2020 čelily tisíce webů našich zákazníků masivnímu zneužití bezpečnostní chyby, která mohla během zlomku vteřiny kompletně vymazat obsah jejich webů.

Aneb jedna detektivka ze zákulisí WEDOS. Bez cenzury.

Interní komunikační kanál #distruptions pro hlášení bezpečnostních incidentů a technických problémů pondělí 17.02.2020

19:46 Zákaznická podpora 1

Už píše 4. zákazník během 30 minut, že mu na WP skočila default šablona aniž by něco dělal

19:47 J.G. (vedení společnosti):

Kde? Na jakém serveru?

19:48 Technik držící službu v DC:

domena-A.cz hc1-wd50 (označení serverů), domena-B.cz hc1-wd53, domena-C.cz hc1-wd54,  domena-D.sk hc1-wd63

19:49 Zákaznická podpora:

domena-E.info wl39-f167

19:50 J.G. (pro informaci dodáváme, že jsou to iniciály Josef Grill):

Obávám se, že někdo hacknul jejich šablonu – všichni mají . Theme By ThemeGrill. Ale já s tím nemám nic společného 🙂 Chtělo by to dohledat a zjistit co a jak to kdo napadnul nebo jak to chránit

19:51 Zákaznická podpora 1:

subdomena.domena-F.eu wl33-f208

19:55 J.G.:

Zkuste to celé analyzovat a zjistit co nejvíce – i z logů. Je asi možné, že tam měli nějaké heslo…

20:04 J.G.:

Zkuste něco z logů. Kibana apod. Kdy tam naposledy dělal někdo nějaký upload apod..


Postupně se připojují další kolegové (zákaznická podpora, technici, vývojáři). Kdo má přístup do Kibana (open source vizualizace pro Elasticsearch), kde se v reálném čase sbíhají data a to včetně logů ze stovek serverů, tak pátrá po útocích. Technici s přístupem k IPS/IDS hledají vzorce a zachycené útoky. Zákaznická podpora sbírá informace od zákazníků a prochází stav napadených webů.


20:09 Zákaznická podpora 2:

Sáhlo si to do databází a ty to pročistilo. Většině přišel email o nové instalaci WP

20:15 Zákaznická podpora 2:

Na FTP zůstalo nejspíše vše, jenom to hodilo databáze do defaultního stavu a poslalo to všem email z WP o nové instalaci

20:18 J.G.:

A co to provedlo? Jaký skript? Jaká IP?

20:39 Zákaznická podpora 2:

Ale třeba uživatelské účty jsou stejné, ty nikdo nesmazal. Opravdu jenom jsou pryč jen příspěvky a stránky.

20:40 J.G.:

Chce to najít jaká IP nebo jaký skript to udělal a to zablokovat všude. A těm lidem udělat zálohy záloh DB 🙂
Zkuste pátrat nyní s maximální prioritou. Chce to nějak dohledat.
Někde v logu musí být nějaká IP, která se tam hlásila do administrace nebo nějakou akci udělala přes nějakou URL
Víte ze kdy to přesně je? Čas. Na minutu přesně a podle toho to najít.

20:49 Zákaznická podpora 2:

hosting domena-F.eu db: d49XXX_xxxxxx Proběhlo: 18:11:51

20:55 Zákaznická podpora 2:

Přímo z DB toho postiženého webu, čas vytvoření těch defaultních příspěvků. se shoduje s časem, kdy lidi začali přibližně psát

21:02 J.G.:

Tam je v logu podezřelá jen tahle: 93.113.111.193 https://www.abuseipdb.com/check/93.113.111.193 ale to je později

21:05 Marketing 1:

A ta databáze je prázdná (jen základní instalace)? Nemohlo to třeba jen vytvořit tabulky s jinou předponou?
Na disku soubory má http://….

21:06 Zákaznická podpora 2:

Ne to jsem kontroloval. Vyloženě to jen smazalo příspěvky a stránky zbytek byl nedotčený+ všem přišel ten email.

21:02 J.G.:

Máte ještě čas nějakého dalšího webu?

21:13 Marketing 1:

Ok tak je to celosvětový problém: “The developers of the ThemeGrill Demo Importer for WordPress have updated the plugin to remove a critical bug that gives admin privileges to unauthenticated users.” “Once all tables have been dropped, it will populate the database with the default settings and data after which it will set the password of the “admin” user to its previously known password.”

21:14 J.G.:

Tak jsem to trefil rovnou 🙂 Ale já s tím nemám nic společného.

21:14 J.G.:

Asi bych to poslal přes odstávky všem klientům na webhostingu.

21:14 J.G.:

Dáte dohromady nějaký jednoduchý text, který pošleme všem?
Plus bych hledal ještě další časy, abychom našli více informací a zkusili najít nějaké IP apod.
A dáme to na sociální sítě
Ale s poznámkou, že já za to nemohu 🙂

21:18 Marketing 1:

Jdu na to

21:25 J.G.:

Máte nějaké další časy? Nedaří se mi najít nic – jak se tam dostali.


21:43 bylo na Facebook a Twitter umístěno varování s popisem problému a odkazem na bezpečnostní zprávu týmu, který zranitelnost objevil. Zároveň začalo rozesílání e-mailu všem zákazníkům. V té době jsme ještě nevěděli o jak velký problém se jedná. První odhady však ukazovali na zasažení několika procent zákazníků.


21:43 J.G.:

A ještě mám pocit, že to provedou uživatelé sami. Když dělají něco v administraci, tak se jim to provede nebo aktivuje.

21:57 Zákaznická podpora 2:

Někdo psal, že v administraci WP nebyl týden a jedna paní psala i měsíc

22:09 J.G.:

Prošli jsme analýzu té bezpečnostní díry a našli prvního útočníka 45.129.96.17


V tento okamžik už jsme věděli co přesně útočník  posílá na zranitelné WordPressy, aby dosáhl jejich “zresetování”, takže nebyl problém jak jej identifikovat. V této fázi jsme prováděli první zásahy ručně a blokovali první IP adresy.


22:21: J.G.:

Podle kibany je těch hacknutých webů asi 150-200


Byly spuštěny první automatické skripty na IPS/IDS ochraně, které dokázali odhalit útočníky a automaticky zablokovat jejich pokusy u webů na HTTP. Zároveň se začala plnit databáze pro druhý stupeň ochrany, která chrání i weby na HTTPS. Ta parsuje logy a hledá i nové specifické řetězce. Do minuty je vše chráněno. 


23:07 J.G.:

Jsou tam další útoky. Nyní třeba přes IP 2607:5300:61:bd9::107

Co se tedy stalo

Než jsme přišli na to, co se děje a připravili IPS/IDS ochranu, tak bylo postiženo 154 webů. Útočník jim přes neošetřený přístup v děravém pluginu “zresetoval” WordPress. Měl to poměrně jednoduché. Detaily jak to provedl najdete v článku bezpečnostního týmu, který chybu odhalil.

Z pohledu naší IPS/IDS ochrany bylo těžké automaticky útok detekovat, protože útok byl proveden přes zavolání URL administrcace WordPress s proměnnou do_reset_wordpress.

Poté co jsme zjistili o jakou bezpečnostní chybu se jedná, tak jsme upravili nastavení IPS/IDS a do rána zachránili více než dalších 1000 instalací WordPress, které u nás mají nainstalovaný problematický pluginy.

V současné době (úterý 18:00) už útoky neprobíhají. Pokud už o útočníkovi víme, tak je zablokovaný. Blokujeme jakýkoliv útok, který detekujeme přes HTTP. Bohužel pokud se jedná o novou IP adresu a útok směřuje na HTTPS, tak tam prozatím nepomůžeme. Do šifrovaného provozu nevidíme. Ale již brzo uvidíme 🙂 . 

Na grafu níže se můžete podávat na statistiku útoků v čase na 10 serverů, které byly nejčastějším cílem. Serverů máme stovky. Celkový počet zaznamenaných útoků byl téměř 41 tisíc.

Úspěšných bylo jen necelých 200 (asi 183). 

Útoky byla provedeny z následujících IP adres:
103.221.222.179
103.4.217.81
107.180.225.158
142.44.151.107
149.202.75.164
159.65.65.204
168.63.19.216
172.68.10.50
172.68.245.131
185.45.72.159
188.166.16.17
188.166.176.184
198.12.156.154
2001:41d0:d:34a4::
209.251.53.192
2607:5300:61:bd9::107
2a03:b0c0:2:d0::11f0:6001
45.129.96.17
46.101.174.128
50.63.162.9
51.68.124.88
62.76.187.179
68.183.204.202

Autoři informace o zranitelnosti našli IP adres méně:

45.129.96.17 200
185.45.72.159 4
46.101.174.128 2
50.63.162.9 2
51.68.124.88 2
62.76.187.179 2
68.183.204.202 2
103.221.222.179 2
107.180.225.158 2
142.44.151.107 2

Máme větší vzorek webů, protože u nás hostuje cca 150.000 webů a z toho velká část (vyšší desítky tisíc) používá WordPress. A více než tisíc jich používá napadnutelný plugin. Celkově na světě bylo ohrožených údajně 200.000 webů s tímto pluginem. To je hezké, protože skoro 0,7% všech je u nás. Docela slušný podíl z celosvětového počtu 🙂

Co plánujeme do budoucna pro zvýšení bezpečnosti našich zákazníků

Za bezpečnostní díry v redakčních systémech, pluginech a šablonách nemůžeme. Víme však že tu jsou a budou, proto také naše ochrany neustále zlepšujeme. Tento rok nás čekají dvě velké novinky, které právě v těchto případech pomohou.

První z nich je vylepšení proxy serverů, které nám umožní filtrovat a chránit obsah šifrovaného připojení. Budeme tak moc detekovat a filtrovat útoky, které jdou i na weby s HTTPS.

Další je služba WEDOS AnyCast. Ta nám přinese nové možnosti ochrany nejen před DDoS útoky. Třeba v tomto případě bychom do podezřelého provozu mohli přidat captcha, což roboty, kteří tyto útoky prováděli, spolehlivě zastaví.

Závěr

Dostali jsme velké množství reakcí. Někteří nám vytýkají, že jsme poslali “poplašnou zprávu”. V době psaní emailu jsme neznali přesný rozsah útoků ani počet potenciálně zranitelných webů. WordPressů hostujeme několik desítek tisíc. Udělali jsme rychlé rozhodnutí a podle mnoha reakcí se vyplatilo. Nebylo to možné odkládat.

Ještě do půlnoci jsme napsali všem klientům, jejichž web byl napaden, že se tak stalo a aby si to vyřešili a jak mají postupovat.

Hledání dalších  zranitelných webů nám trvalo několik hodin. Zkuste prohledávat stovky fyzických serverů a na nich hledat určité soubory s určitými atributy  a určitým obsahem. To skutečně rychleji nedáte. 🙂
Když jsme to ráno dokončili, tak jsme informovali již cíleně všechny konkrétní zákazníky, kterých se to týkalo.  Napsali jsme všem, kteří měli uvedený plugin ve zranitelné verzi, že je nutné situaci řešit. 
Jak s tím kdo naložil nevíme, ale většina to vyřešila.

Většina webů u nás běží na WordPressu. Je to nyní nejpopulárnější redakční systém. Tak jsme vycházeli z té většiny a raději jsme někomu poslali “poplašnou zprávu”, než mít prodlení a nechat (v té době) neznámý počet webů smazat.  Berte v úvahu, že nám tam jede na webhostingu cca 150 tisíc domén II. řádu plus k tomu poměrně vysoký počet subdomén na doménách III.řádu…
Je to na stovkách fyzických serverů… A najednou to není tak snadné dopátrat co jede na WordPressu a co má jaký plugin a v jaké verzi. Zjištění také trvá poměrně dlouhou dobu. Druhý den nám trvalo několik dalších hodin. Kdybychom měli podobné prodlení, tak není co zachraňovat. 

Ano chodí nám i negativní anebo zmatené reakce lidí, kteří WordPress nepoužívají, ale těm poctivě odpovídáme. Po přečtení výše uvedených řádku jistě chápete, že šlo o každý okamžik. Nemohli jsme nic odkládat.

Přišlo nám také několik dotazů, proč jsme na problém upozornili jako jediní, proč konkurence nijak nereagovala. Popravdě na tuto otázku odpověď radši nemáme 🙂

Máme všechna data – logy centralizovaně a tak každou sekundu logujeme desítky tisíc (nebo víc) záznamů.  Tato BigData přesně pomáhají cokoliv řešit. Hned víte všechny souvislosti. Máme detekční a filtrační systémy a tak jsme si s tím poradili. Máme tým zkušených kolegů, kteří umějí podobné situace řešit. Proto jsme tam, kde jsme. 🙂

Věděli jsme, že weby našich zákazníků jsou v ohrožení a tak jsme jednali. Nestydíme se za to. Pokud se někdo kvůli tomu “zbytečně” přihlásil do administrace svého redakčního systému, aby zkontroloval, zdali má vše aktualizované, tak se mu omlouváme.

Upřímně řečeno by bylo fajn, kdyby všichni provedli všechny aktualizace, abychom nemuseli řešit podobnou detektivku zase příště.