ugrás a tartalomhoz

ReDoS-ról tudtok valamit bővebben, hogy milyen minták érintettek?

inf3rno · Júl. 24. (Sze), 16.17
Egyelőre most csak ennyit olvastam a témában: https://snyk.io/blog/redos-and-catastrophic-backtracking/

Ez alapján a cikk alapján az "a(?:b|c+)+d" jellegű minták biztosan nem jók. Ha jól vettem ki a két quantifier-t próbálja egymással többféleképpen kombinálni a regex engine, és kipróbálja az összes permutációt, hátha valamelyik működik a string-re, amit talált, de egyik sem fog, ha "d" helyett "x" van a string-ben a végén. Emiatt elmókolhat egy sima regex-es validációval akár percekig is lefagyasztva az egész szervert. Ezek alapján nekem úgy tűnik, hogy nem érdemes quantifier-eket egymásba ágyazni, mert akkor kapásból fennállhat ez a helyzet, illetve érdemes lehet a regex-es kódot kitenni külön thread-be vagy process-be, mert igaz, hogy lassabb, de legalább az olvasás működik, ha beüt a krach, mert arra nem jellemző a regexes validáció.

A kérdés az, hogy van e ott még több is, ahonnan ez jött? Jó lenne ismerni az összes ilyen sebezhető mintát, és kiváltani őket. Tudtok erről valamit?
 
1

Kicsit olvasgattam a témában,

inf3rno · Júl. 24. (Sze), 23.28
Kicsit olvasgattam a témában, így néz ki a dolog a gyakorlatban: http://blog.malerisch.net/2015/09/net-mvc-redos-denial-of-service-vulnerability-cve-2015-2526.html

Elméletben ez a legrészletesebb eddig, amit találtam: https://www.regular-expressions.info/catastrophic.html. Lassan érik, hogy adakozzak nekik, annyira régóta használom az oldalukat regex témában, és annyira részletes az egész.

Úgy néz ki, hogy nem csak nested quantifier-nél fordulhat elő, hanem egymást követő ".*"-ot tartalmazó regexeknél is. Igazi megoldás atomic group lenne rá, de sajnos a JS nem támogatja. Alternatív megoldás egy timeout-ot hozzátákolni. Viszont mivel ez alapból nem támogatott, ezért csak úgy megoldható, ha kitesszük külön thread-be vagy process-be a regex-et, és ha lejár az idő, akkor lelőjük. Gondolom tárhely függő, hogy az extra thread-ek miatt többet kell e fizetni.

Egyelőre most azon agyalok, hogy vajon a hosszabb regex minták feldarabolásával és/vagy átírásával elérhető e ugyanaz az eredmény anélkül, hogy külön thread kellene neki. Pl az "a(?:b|c+)+d" esetében át tudjuk írni "a(?:b|c)+d"-re, ami elvileg máris jó, mert nincs benne nested quantifier. Darabolással lehetne esetleg "a([^d]+)d" majd a capturing group tartalmának ellenőrzése "(?:b|c+)+"-vel, bár talán ebben az esetben is problémás a nested quantifier. Ki kell próbálnom, mert bizonyos esetekben nem probléma, máskor meg igen, és még nem teljesen értem, hogy mikor melyik van.