Autóipari zászlórablás 2024

Az élet tele van megszakításokkal. Miután az előző posztomban jól beharangoztam a PHP deobfuscator 2. részét, sőt, el is kezdtem írni a bejegyzést, természetesen beérkezett egy nagy rakás megszakítás, amelyek közül az egyiknek egy új blogposztot kellett eredményeznie. Mivel annak a témának előbb lett vége (és konklúziója), minthogy elkészült volna az a bizonyos 2. rész, álljon most itt egy újabb vendégposzt, azaz az Égvemaradt.hu-hoz szervesen nem, csak személyemen keresztül kapcsolódó bejegyzés.


Augusztus végén négy munkatársammal hirtelen felindulásból beneveztünk a Block Harbor Cybersecurity által szervezett Automotive Capture The Flag 2024 nevű versenyre. Mindannyiunk számára ez volt az első ilyen megmérettetés, így lelkes amatőrökként csupán annyit tudtunk az egészről, hogy ez egy hackerverseny, ahol többé-kevésbé autóipari rendszerek feltöréséért kaphatunk majd pontokat.

Ez a poszt nem egy élménybeszámoló magáról a versenyről, hanem egy technikai leírás arról, hogy hogyan sikerült átverekednünk magunkat a verseny „We’ll see in the Mach-E” fejezetén. Ehhez a fejezethez egyetlen hatalmas CAN logot kaptunk, az ide tartozó feladatok mind ehhez kapcsolódtak. A log 5 különböző CAN csatorna logját tartalmazta mindenféle metaadat (például időbélyegek) nélkül, így kell elképzelni, csak sokkal hosszabban:

Mivel a Notepad++ nehezen boldogult a több mint két és félmillió soros fájllal, első lépésként külön fájlokba gyűjtöttem az egyes csatornák üzeneteit. Emiatt a továbbiakban néha több fájlban is kellett keresgélnem, de máskor meg pont előny volt, hogy egyszerre csak egy csatornát látok.

A 2-es csatornán azt vettem még észre, hogy az általam várt # helyett ## választotta el egymástól a CAN ID-kat és az adatot, illetve alaposabban megnézve az is feltűnt, hogy az adat mindig 5-tel kezdődik, és a (hagyományos) CAN-en maximálisan elképzelhető 8 helyett 8,5 bájt hosszú. Ezért azzal a feltételezéssel éltem, hogy a szeparátor igazából a ##5 string, úgyhogy azt mindenhol lecseréltem a számomra kényelmes #-ra.

Ezután már neki lehetett ugrani a feladatok megoldásának. A továbbiakban a címsorok a feladat nevét, a dőlt betűs szövegek pedig a feladatkiírást tartalmazzák.

DID Access

What negative response code was given for DID 0x4915?

Bár ezt a feladatot nem én oldottam meg, azért leírom a megoldás menetét, melyhez az UDS diagnosztika (legalább felületes) ismeretére volt szükség. Mivel a mi csoportunk munkájának szerves része az UDS használata, ez a feladat igazából gyerekjáték volt.

A feladatban szereplő DID a Data Identifier rövidítése, amelyet két UDS service használ, a Read Data By Identifier (service ID = 0x22) és a Write Data By Identifier (service ID = 0x2E). Az egyik ilyen service kérésére érkező negatív választ kerestük, ehhez pedig először meg kellett találnunk a kérést.

A 4915 bájtkombinációra rákeresve 24 találatot kaptam, a találatok között pedig azonnal ki lehetett szúrni azokat az üzeneteket, ahol a 4915-öt 22 előzte meg (2E-t nem találtam), azaz a Read Data By Identifier-eket.

Ebből kiderült, hogy a keresett UDS kérés-válasz a 3-as CAN csatornán lesz, a kérés CAN ID-ja pedig 7E4. Ezután nem volt más dolgom, mint az egyik megtalált 7E4#03224915 után keresni egy hasonló (de nem megegyező!) ID-jú üzenetet, aminek a második bájtja 7F, az jelenti ugyanis a negatív választ. Ez hamar meg is lett:

Ebben az üzenetben a 7F utáni 22 mutatja azt, hogy ez a negatív válasz a 0x22-es service kérésre érkezett, a 22 utáni 31 pedig a keresett hibakód, ez volt a feladat megoldása.

Persze lehetett volna tudományosabban is keresni, például a #..7F22 reguláris kifejezéssel; az is azonnal megmutatta volna a keresett kódot:

Az UDS üzenetek amúgy ISO-TP-be vannak csomagolva (ez a felelős az üzenetek első bájtjaiért), de ennél a feladatnál az ISO-TP részleteibe nem kellett beleásnom magam a megoldás megtalálásához, úgyhogy annak az ismertetésébe nem is megyek itt bele.

What is the VIN?

What is the VIN of the vehicle driving?

Itt a jármű alvázszámát (Vehicle Identification Number) kellett megtalálnunk. Alapesetben a DID-k kiosztása gyártóról gyártóra, ECU-ról ECU-ra változhat, de a VIN DID-ja pont szabványos, 0xF190. Viszont hiába kerestem rá, a logban nem találtam 22F190-et. Ez persze nem jelenti azt, hogy a 0xF190 DID-val nem lehet lekérni a VIN-t, csupán azt, hogy a logolt időszak alatt senki nem kérte azt le.

Abban kellett tehát bíznom, hogy van olyan ECU, amelyik kérés nélkül is broadcastolja az alvázszámot, hiszen ebben az esetben az biztosan benne van a logban. Már csak meg kellett tudni, hogy vajon hogyan találhatom meg. Saját érintettségem okán például tudom, hogy a Skodák alvázszáma TMB-vel kezdődik (fun fact: az MB Mladá Boleslavot jelöli), de más márkák konvencióit nem ismerem.

Ha a feladatcsoport neve („We’ll see in the Mach-E”) nem lett volna elég beszédes, néhány előző feladatból is kiderült, hogy a szervező Block Harbornak van legalább egy Ford Mustang Mach-E-je. Így hát adta magát a feltételezés, hogy egy ilyen autóban vették fel a logot is, úgyhogy próba-szerencse alapon elindultam ebbe az irányba.

Forrás: Wikipédia

Egy gyors Google-keresés elárulta, hogy ezeknek az autóknak 3FM-mel kezdődik az alvázszáma. Ezeknek a karaktereknek az ASCII kódjai 0x33, 0x46, 0x4D (az ASCII <-> hex konverter a verseny ideje alatt kb. végig nyitva volt), így hát rákerestem a 33464D stringre.

Bingó! A 40A üzenetek több CAN csatornára is átgatewayezve terítették a VIN-t, amelynek a következő karakterei 0x54, 0x4B, 0x34, azaz TK4 voltak (ami amúgy tökéletesen egybe is vágott az előzőleg talált VIN dekóder információival).

Igen ám, de a teljes VIN 17 karakterből áll, hol a többi? A megtalálásukhoz elég volt rákeresni az üzenetre az egyik csatornán (a 3-as épp nyitva volt, azt választottam), és a találati listában könnyen észre lehetett venni a mintát:

Úgy tűnt, hogy az első bájt, a C1 jelzi magát a VIN-t, mint valami proprietary DID. A következő bájt egy számláló gyanúját vetette fel, így az üzenetek harmadik bájtjától olvastam össze a VIN-t, amire 3FMTK4SX8MME00878 jött ki. Az utolsó üzenet utolsó bájtja FF, ami nem egy ASCII karakter (a legmagasabb ASCII karakter értéke 0x7F), úgyhogy azzal nem foglalkoztam. Az így megtalált VIN volt a feladat megoldása.

Street Names

What street names did we drive on in this log that the vehicle sent on the can bus?

Flag is list of street names without St, Dr, Ave etc and with commas between them. In the order they appear in the log. For example: Woodward,Maple,Southfield

A feladat most utcanevek keresése volt. Mivel ez egyértelműen ASCII információ, gyorsan összeraktam egy Python scriptet, ami a kapott CAN log minden sorához hozzácsapja az adatbájtokat ASCII-ként dekódolva kapott stringet. Pontosabban nem én raktam össze a scriptet, hanem a ChatGPT, én csak a végén a saját szám ízére formáltam. 🙂

Miután ezzel a scripttel átmentem egy logfájlon, ilyen kimenetet kaptam:

Ebben már azonnal látszik az előző feladatban megtalált alvázszám első néhány karaktere. (Amúgy simán lehet, hogy némi keresés után fel tudtam volna paraméterezni a candumpot úgy, hogy előállítsa ezt a kimenetet, és szinte biztos, hogy találtam volna rá másik toolt is, de egyrészt mint tudjuk, 6 órányi debuggolással simán megspórolható 5 percnyi dokumentációolvasás, másrészt pedig akinek kalapácsa van, az mindent szögnek lát.)

A következő feladat annak a kitalálása volt, hogy mire keressek. Mivel a feladatkiírás úgy szólt, hogy a megoldást St (street), Dr (drive) és Ave (avenue) nélkül kell megadni, feltételeztem, hogy legalább az egyik rövidítést meg fogom találni a logban, és hogy kis szerencsével ezek a rövid stringek nem lesznek szétvágva két CAN üzenetbe.

Az St-re 4433 találatot kaptam, de elsőre nem volt szembetűnő, hogy tényleg a street rövidítését találtam volna meg. A Dr-re már csak 109 találat jött, de az sem volt meggyőző, az Ave viszont csak 5-ször szerepelt, ráadásul mindig ugyanabban az üzenetben, az 1-es csatornán lévő 2C0-ban. Megnéztem hát alaposabban azt az üzenetet, és a következőt találtam:

Sikerült! És még csak további scriptelésre sem volt szükség, elég volt értelemszerűen összeolvasni az egymást követő utcákat: Piedmont Drive, Acacia Drive, Wheaton Avenue, Rochester Road. A megoldás tehát Piedmont,Acacia,Wheaton,Rochester volt.

Radio

What FM radio station were we listening to?

Ennél a feladatnál abból a feltételezésből indultam ki, hogy hasonlóan az utcanevekhez, a rádióadó nevét is CAN-en keresztül kapják meg a megfelelő kijelzők. Tehát megint ASCII tartalmat kerestem, de most nem állt rendelkezésemre segítség. Úgyhogy tippeltem, és rákerestem először az FM-re, de annak a találati listája (épp a VIN miatt) nagyon zajos volt.

A második tippem az MHz volt, ami viszont már érdekes találatokat adott:

Ezek alapján az 1-es csatorna 2B4 üzenetére szűrtem rá, és beigazolódott a sejtésem, hogy jó helyen járok:

Amúgy vicces látni a rádió neve helyén időről időre lefutó reklámot (Injured? Slip & Fall? FallLaw.com), ilyesmit idehaza már jó régen nem láttam. 🙂

Az üzenetekből kiderült, hogy a rádióadó frekvenciája 95.5 MHz, és egy helyen pedig Michigan állam neve is feltűnt (MICHIGAN AUTO LAW). Természetesen rápróbáltam a 95.5-re megoldásként, de azt nem fogadta el a rendszer, ezért rágugliztam a „Michigan 95.5 FM” kifejezésre, ami kidobta nekem a WKQI Wikipédia lapját. Megpróbáltam hát a WKQI-t is, de nem az volt a jó megoldás, hanem a sokadik próbálkozásra beírt 955 (a Wiki lap adta az ötletet ezzel: „[…] known as “Channel 955”, pronounced “nine-five-five””). Vagy az is lehet, hogy pont fordítva volt, már nem emlékszem pontosan, csak az maradt meg, hogy nagyon sokadik próbálkozásra találtam el a megfelelő formátumot.

When were we driving?

On what day did the drive in this can log take place? (answer in DD/MM/YYYY)

Ezzel a feladattal jó sokáig elszöszmötöltem, és végül nem is én, hanem egy csapattársam oldotta meg helyettem.

Itt ugye az volt a feladat, hogy megtaláljuk a dátumot, de ennek a módja egyáltalán nem volt triviális. A mi rendszereinkben, amelyek nagyrészt követik a J1939 szabványt, a dátum és az idő egy standardizált üzenetben utazik, a 0xFEE6 PGN-ben. Az üzenet formátuma kötött, és többé-kevésbé logikusan, egy-egy bájton ábrázolja az évet, hónapot, napot, órát, percet és másodpercet (valamint az aktuális időzóna UTC-től való eltolódását órában és percben). Az év kivételével mindegyik szám kényelmesen belefér egy bájtba, az évre pedig úgy rémlik, hogy találkoztam már 1980-as és 1985-ös eltolással, illetve persze a számítógépeknél általános 1970-es érték is szóba jöhetett. Azt feltételeztem, hogy a szervezők nem álltak neki túl korán a versenyre való felkészülésnek, ezért a log idén készülhetett, de ezen felül nem volt további információm. Ráadásul mivel ez a CAN kommunikáció nem a J1939 alapján épült fel, ezen az ágon nem tudtam továbbhaladni.

Amiből viszont ki tudtam indulni, az az idő volt, pontosabban a másodperc. Tudtam, hogy a CAN logok legalább néhány percnyi időt ölelnek fel, hiszen ennél rövidebb idő alatt valós forgalomban nehéz négy különböző utcát érinteni. Ebből kifolyólag a másodpercnek többször át kellett fordulnia 59-ről 0-ra, tehát ha egy olyan bájtpozíciót találok, ami 0-tól 59-ig növekszik, majd 0-ról indul újra, akkor jó eséllyel meglesz az időt (és minden bizonnyal a dátumot is) tartalmazó üzenet!

Írtam tehát egy (általános) számlálókereső Python scriptet, ami a következőket csinálta:

  1. Felparse-olta a CAN logot, minden sort csatornára, CAN ID-ra és adatbájtokra bontva
  2. Közben felépített egy objektumot a memóriában, ami csatornánként és ID-nként csoportosítva eltárolta az üzeneteket (opcionálisan eldobva az ismétlődőket)
    • Az objektumot ezután cache-elte egy fájlba, hogy a legközelebbi futtatásnál már ne kelljen a hosszadalmas parse-olást végigvárni
  3. Ezután pedig minden egyes üzenetfolyamban számlálókat keresett a következőképpen:
    1. Az üzenet minden bájtjához hozzárendelt egy 0-ra inicializált ún. számlálóvalószínűségi változót
    2. Az üzenetfolyam minden üzenetére elvégezte a következőket:
      1. Az üzenet adatait bájtokra bontotta
      2. Kiszámolta az aktuális és az előző üzenet n-edik bájtjának különbségét (n = 1..8)
      3. Ha ez az n-edik különbség épp 1 volt, akkor megnövelte az n-edik számlálóvalószínűségi változót
    3. Az üzenetfolyamban talált számlálóvalószínűségi változókat az üzenetek számával normalizálta 0 és 1 közé

A számlálók valószínűségi keresésére és a normalizálásra azért volt szükség, mert ha bármilyen emelkedésre számlálónak ítéltem volna egy bájtot, akkor sok fals pozitívot kaphattam volna, ha pedig minden egyes üzenetben növekedést vártam volna el, akkor a túlcsordulások miatt a 0-ra váltásoknál valós találatokat veszítettem volna el. Így viszont előállt egy szép statisztika, ami alapján már jó eséllyel lehetett megtalálni a tényleges számlálókat:

A fenti példa azt mutatja meg, hogy a 0-s CAN csatorna 084 és 091 üzenetének és 6. bájtja jó eséllyel egy-egy számláló, míg a többi valószínűleg nem az.

Az ismétlődő üzenetek eldobását abból a megfontolásból tettem bele a scriptbe, hogy ha egy lassan változó jel (a másodperc ilyen) üzenete a változásnál gyakrabban érkezne (tehát másodpercenként többször), akkor se csökkenjen emiatt az adott bájt „számlálóvalószínűsége”.

A script kimenetében a 0.9 fölötti számokra rákeresve mindössze 28 találat érkezett, ezeket pedig már könnyű volt végignézni a logban. Hamar rá is akadtam a 084-re, ami így nézett ki:

Ez elég ígéretes! A 6. bájt ugyanis épp 0x3B, azaz 59 után fordul át 0-ra, ezzel együtt pedig az azt megelőző bájt is növekszik eggyel (miközben 60 alatt marad)! Ráadásul ezt az üzenetet több csatornán is megtaláltam, ami az időt terítő üzenet esetén logikusnak is tűnik.

Elfogadva a feltételezést, hogy ez a keresett üzenet, már csak az volt hátra, hogy megtaláljam benne a dátumot. A perc és a másodperc megvolt, az óra pedig minden bizonnyal ott volt vagy előttük, vagy mögöttük. Az első bájt 0x18-as, azaz 24-es értéke gyanúsan 2024-re emlékeztetett — lehet, hogy Fordék így kódolják az évet? Az utána következő 0x0000B2 viszont sehogy nem illett a képbe. Ha elfogadom, hogy az utolsó 0x0D az óra, akkor ebben a számban kellett benne lennie a hónapnak és a napnak. De még ha mondjuk 0-tól is kezdjük a hónapokat, és az egyik 0x00 januárt jelenti, a 0xB2 értéke akkor is 178, ami sehogyan nem lehet nap. Láttam már olyan trükköt, hogy a másodpercet és a napot 1/bit helyett 4/bit felbontással küldik, de a 178 még így is 44-et jelentett volna, ami se hónap, se nap nem lehetett.

A megoldásra majdnem egyszerre jöttünk rá egy csapattársammal, ő volt a gyorsabb. Már nem tudom, pontosan hol láttam meg azt a gondolatot, hogy az év után nem hónap és nap következik, hanem a nap sorszáma az éven belül. A 2024-es év 178. napja június 26. volt (ezt szerencsére a Google kapásból meg is mondta), és a 26/06/2024 flagre rápróbálva meg is kaptuk a pontokat.

Tényleg nem dolgoztak túlságosan előre a szervezők! 🙂

Where were we driving?

What was the latitude and longitude of our destination in degrees and minutes?

Example Flag: LatitudeDegrees.LatitudeMinutes,LongitudeDegrees.LongitudeMinutes 00.00,00.00

Koordinátákat keresni nem tűnt könnyű feladatnak, ugyanis vajmi kevés esélyt láttam arra, hogy ASCII-ként legyenek átküldve a CAN-en. Én magam lebegőpontos számokként küldeném őket, azok pedig egyáltalán nem szembeötlőek egy hatalmas bájtfolyamban.

Ezért ennél a feladatnál be is zártam a CAN logot, és inkább a Google Mapset nyitottam meg.

Az egyik előző feladatból kiderült ugyanis azoknak az utcáknak a neve, ahol a log készült. Ha az autó végig közúton haladt, akkor egymás melletti Piedmont, Acacia, Wheaton és Rochester nevű utakat kellett találnom, ami azért már elég egyedi kombinációnak tűnt ahhoz, hogy csak egy környéken legyen.

A rádiós feladat erősen utalt Michiganre, úgyhogy ott kezdtem a keresgélést. Az utcaneveket beírva láttam, hogy néhány javaslat Detroit Troy nevű városrészébe mutatott, ekkor pedig beugrott, hogy az egyik alapító adatlapján láttam már ezt a helyet, amikor egy korábbi feladathoz OSINT-et gyűjtöttem. Nemsokára meg is találtam a környéket:

Ha pontos koordinátákat kértek volna, akkor ennyiből még nem tudtam volna megadni a végpontot, de szerencsére csak szögperc pontossággal kellett válaszolni. Itt, az északi szélesség 42. foka környékén egy hosszúsági szögperc kb. 1,38 km, egy szélességi szögperc pedig kb. 1,85 km (mint akárhol máshol). Egy ekkora téglalapba pedig már könnyen bele lehetett találni próbálgatással, ha jól emlékszem, elsőre meg is lett a megfelelő megoldás, a 42.33,-83.07.

Itt amúgy annyi trükk volt még, hogy a számítástechnikában leggyakrabban használt formátumot, a tört fokokat fokba-szögpercbe kellett átváltani (általános iskolai anyag), illetve az európai szemnek szokatlan nyugati hosszúságot negatív számként kellett ábrázolni.

Steering Angle

What arbitration ID has the steering wheel angle?

A fejezet utolsó feladatának megoldásához volt szükségem a legtöbb időre. A kérdés az volt, hogy milyen CAN ID-val küldi az üzeneteit a kormányszögszenzor, ezért elsőnek megpróbáltam beazonosítani, hogy milyen alkatrészről van szó. Reménykedtem, hogy ezután találok majd további modelleket is, amelyek ugyanezt a szenzort használják, aztán pedig hátha sikerülne CAN adatbázist találni legalább az egyikhez.

Sajnos most nem volt szerencsém (vagy nem voltam elég kitartó), ezért egy idő után feladtam a keresést, és visszatértem a CAN loghoz. Összeszedtem, hogy mit tudok (vagy legalábbis sejtek) a kormányszög CAN jeléről: folytonos, viszonylag pontos jel, viszonylag hosszú középállás körüli értékkel (mert a fent megtalált utcák eléggé egyenesek) és onnan mindkét irányba való kitéréssel (mert valószínűleg jobbra és balra is kormányoztak). Ezen felül megelőlegeztem egy legalább 8 bites felbontást, de inkább jobbat, és egy jó széles értéktartományt, amit a jel valószínűleg nem használ ki (nem valószínű, hogy menet közben koppanásig tekerték volna a kormányt).

Ezek a tulajdonságok jól látszanak egy grafikonon, de a nyers CAN logban egyáltalán nem, úgyhogy azt láttam a legbiztatóbb útnak, ha grafikusan ábrázolom az adatokat. Valószínűleg átkonvertálhattam volna a logot valami olyan formátumba, amit aztán egy létező tool meg tud nyitni, de aztán valamiért mégis úgy döntöttem, hogy saját vizualizálót készítek, méghozzá HTML és Javascript alapokon, mert ezekkel tudtam a leghatékonyabban összehozni egy gyorsan alakítható, interaktív és grafikus felületet.

Az oldal betöltés után behúzza az összes CAN adatot (ugyanabból a cache fájlból, amit még a számlálókereséshez készítettem), aztán a user választhat, hogy melyik csatorna melyik üzeneteit akarja grafikonon látni. A tool az üzenet minden bájtját külön CAN jelként kezeli (itt éltem a feltételezéssel, hogy a kormányszög jele legalább bájthatárról indul), és egy közös grafikonon mutatja őket. Ezután pedig a humán intelligencia mintafelismerő képességében bízva elkezdtem az összes üzenet grafikonját az ún. guvadtszem-módszerrel átnézni.

Az elkészült grafikonok ilyenek voltak:

Listát készítettem azokról az ID-król, amelyekben találtam engem kormányszögre emlékeztető grafikonokat, majd elkezdtem flagként végigpróbálgatni őket. Végül nem is olyan üzenet lett a befutó, amelyikre legerősebben tippeltem, de azért így is sikerült megtalálni a megoldást, a 0x07E-t.

Konklúzió

A fenti leírás a megoldások menetének tömör összefoglalója; a rengeteg vargabetűt, zsákutcát, sötétben tapogatózást kihagytam belőle. Pedig ezekből állt az időnk nagy része, egy alkalommal például órákon keresztül készítettem egy Excel táblát arról, hogy melyik CAN üzenet melyik csatornákon jelenik meg — ez később teljesen feleslegesnek bizonyult.

Viszont mindannyian rengeteget tanultunk a verseny két hete alatt, jövőre pedig ezzel az új tudás birtokában, az idei tapasztalatokkal és toolokkal felvértezve állunk újra a rajtvonalhoz!

Vendégposzt: Hogyan nem írtam univerzális PHP deobfuscatort – 1. rész

A vendégposzt alapesetben ugye az a poszt, amit nem a blog szokásos szerzője, hanem egy vendégszerző ír. Na most ebben az esetben nem a szerző a vendég, hanem a téma, a most következő dolgok ugyanis nem az Égvemaradt.hu-val, hanem egy másik weboldallal estek meg. Azt az oldalt nem én készítem, hanem egy kedves barátom, akit az egyszerűség kedvéért nevezzünk most Liának. Az oldalt pedig – szintén az egyszerűség kedvéért – nevezzük lia.hu-nak.

Történetünk egy szép, kellemesen meleg februári napon vette kezdetét, amikor Lia rám írt, hogy “van egy kis gond”, ugyanis minden jel arra utal, hogy feltörték a WordPress-alapú honlapját, a lia.hu-t. No, ennek a fele sem tréfa, gyorsan rá is néztem az oldalra, de nem láttam semmi gyanúsat.

Kis kitérő: azt érdemes rólam tudni, hogy egy ideje már a kiberbiztonságból élek. Ez a fő- és a mellékállásom is, magánszemélyként is érdeklődöm is a téma iránt, és ha valaki más azzal fordult volna hozzám, hogy egy barátja segítséget kért tőle valami hekkertámadással kapcsolatban, akkor csípőből el tudtam volna mondani neki a nyomozás elkezdéséhez szükséges óvintézkedéseket: virtuális gép, tűzfal, antivírus, vegyvédelmi öltözet, azt’ hajrá. Nna, ehhez képest sikerült nekem azonnal megnyitni a lia.hu-t, a saját gépemről, a saját böngészőmből.

Animated GIF
Nem vagyok egy okos ember...

Nemhiába mondják, hogy a suszter gyerekének lyukas a cipője… Mondjuk rendszeresen frissített böngészőm, tűzfalam meg antivírusom legalább van.

Az oldal első blikkre tényleg rendben volt, de akármelyik linkre kattintottam, csak ugyanarra a statikus főoldalra kerültem vissza. Gyorsan megnyomtam a hackergombot, de ott sem láttam semmi érdekeset, úgyhogy inkább másik irányból közelítettem meg a problémát.

Ha nagyon hivatalos akarok lenni, akkor azt mondhatom, hogy eddig ún. black box tesztelést végeztem, azaz a rendszerbe nem belepiszkálva (a dobozt nem kinyitva) vizsgáltam annak működését, viselkedésanalízist folytattam. Viszont én már kisgyerekkorom óta sokkal inkább a white box megközelítést érzem magaménak (mondjuk így azt, hogy gyakran szétszedtem dolgokat, amiket aztán néha nem tudtam összerakni), úgyhogy inkább kinyitottam azt a bizonyos dobozt, és gyorsan be-FTP-ztem a tárhelyre, hogy fájlszinten nézhessek szét.

Érdekel a téma, tovább olvasom!

Hosszú poszt egy hosszú időszakról

Eltelt egy újabb év. Illetve hát jó, egy kicsit több, merthogy három éve került ide a legutóbbi bejegyzés.

Három év!

3!

Az azért webes mércével elég durva, legalábbis nekem, és legalábbis ahhoz képest, hogy már a tavalyi év végén is terveztem írni ide egy frissítést, hogy mi történt az elmúlt időszakban az Égvemaradt.hu háza táján. Az mondjuk nem lett volna egy hosszú poszt, mert kimerült volna egy teljesen érdektelen tárhelyváltásban, meg abban, hogy a műszaki vizsga érvényességi idejét (lásd az előző bejegyzésben) most már regisztrációkor is azonnal meg lehet adni.

Azt hiszem, érthető, miért foglalkoztam inkább a karácsonyi bejglivel a blog helyett.

Morpheus felajánlja Neónak a bejglit és az Égvemaradt.hu blogját
Te melyiket választottad volna?

Ha ránézek az elmúlt évek commitjaira, akkor azt látom, hogy ’17 vége óta tulajdonképpen nem történek a felhasználók által is észrevehető változások. Ezt többféleképpen is fel lehet fogni, de én szeretem úgy gondolni, hogy ez azt támasztja alá, hogy az oldal stabilan nyújtja azt a szolgáltatást, amiért létrejött, és egyszerűen úgy jó, ahogy van. 🙂

Persze létezhet egy olyan narratíva is, amely szerint az oldal régi, ne adj’ isten elavult – hiszen 2020 végén járunk, a webes trendek pedig nagyjából már akkor elhúztak az oldal mellett, amikor… Áhh, lássuk be, az Égvemaradt.hu soha nem használta az aktuálisan felkapott megoldásokat. Én így vagyok punk.

Na de akkor mi változott most? Mi történt, amit feltétlenül ki/le kell blogolni, mi kívánkozik annyira a képernyőre (vagy inkább ki belőlem)?

Ebben az évben két “égvemaradtos” történés volt velem, áprilisban a push értesítések körül, az év második felében pedig az Autóőrszem megjelenésével kapcsolatban. Mindkettő elég érzékenyen érintett, és valószínűleg azért nem írtam belőlük azonnal blogbejegyzést, mert számomra sajnos nem sikertörténetek. A push-sal kezdem, az a rövidebb.

Érdekel a téma, tovább olvasom!

Születésnap, név-nap

Bő egy hónap nyári szünet után üdv újra a blogon! Posztok hiányában azt gondolhatnád, hogy az augusztus uborkaszezon volt, de ez nem igaz. Sőt! Augusztusban és szeptember elején a következők történtek:

  1. Egy évesek lettünk
  2. Nevet váltottunk
  3. Megújult az SSL tanúsítványunk
  4. Tárhelyszolgáltatót váltottunk

És hogy hogyan érint ez Téged?

Egy évesek lettünk

Örülj velünk! Ezen kívül más dolgod nincs. 🙂

Boldog születésnapot!
Ő is örül, a maga módján.

Nevet váltottunk

Sok jótanácsot megfogadtunk a tesztév alatt, de az egyik legnagyobb horderejűvel, a névváltoztatással eddig vártunk. Most viszont, hogy egy éves lett a projekt, ideje volt elhagyni a munkacímet, a nehezen megjegyezhető, sokak szerint nyakatekert logikájú RszMail-t, és felvenni a sokkal felhasználóbarátabb, magával az URL-lel is harmonizáló Égvemaradt.hu-t. Így most már nem lesz többé kérdés, hogy mit jelent a név, illetve hogy akkor most miért nem az rszmail.hu címen érhető-e el az oldal — a keresztelővel ezt a kétértelműséget sikerült teljesen tisztázni.

keresztelo

Az oldalon most már mindenhol az új névvel találkozhatsz, a blogon viszont nem írom át a régi bejegyzéseket, mert az a történelem meghamisítása lenne, meg amúgy is rengeteg (felesleges) munkát jelentene. 🙂

Megújult az SSL tanúsítványunk

Mivel a Let’s Encrypt által kiállított SSL tanúsítványok 3 hónapig érvényesek, szeptember elején újra kellett igényelni egyet. Elképzelhető, hogy az internet valamelyik bugyra (a tárhelyszolgáltató, a DNS szerverek, valaki más útközben, a böngésződ vagy akármi, nem akarok hülyeséget mondani) elgyorsítótárazta az előzőt, ami ugye már lejárt. Ha az egvemaradt.hu betöltésekor hibaüzenetet kapsz, akkor ürítsd ki a böngésződ gyorsítótárát, és próbáld újra. Ha ezután sem működik a dolog, akkor írj nekünk!

Tárhelyszolgáltatót váltottunk

Ez csak FYI, egyáltalán nem érinti a felhasználókat.

Ez a poszt most csak ennyi, a jövőben majd igyekszem érdekesebb eseményekről beszámolni. 🙂

belyeg128_small


Hogy mit honnan:

A Zöld Lakat

Nemrég egy alig észrevehető, mégis nagyon fontos változás került be az RszMail-be. A szemfüleseknek talán feltűnt, hogy a böngésző címsorában megjelent A Zöld Lakat:

lakat_grad
Ott van!

Ez nem kisebb dolgot jelent, mint azt, hogy az oldal mostantól biztonságos kapcsolatot biztosít a szerver és a böngésződ között!

buliNéhány korábbi posztban (pl. ebben) érintettem már ezt a témát, így most nem szeretnélek untatni a részletekkel, de a lényeg, hogy ezzel az új, jövőbe mutató* fejlesztéssel új kapuk tárultak ki az alkalmazás előtt. Ezek közül az első és legfontosabb a push értesítések lehetősége, később pedig további kényelmi és/vagy hasznos funkciókat tudunk beépíteni (pl. rendszámfelismerés fényképről).

A biztonságos kapcsolat örömére ki is kapcsoltam a Firebase appot, ami eddig a push értesítéseket kezelte (mondjuk teljesen megszüntetni nem volt szívem, úgyhogy az odatévedőket most udvariasan átirányítjuk a Főoldalra). 🙂

southpark

További előny, hogy mostantól a jelszavad is biztonságosan utazik a hálózaton, így sikerült még egy támadási lehetőséget elvennünk a gonoszoktól. Ettől függetlenül továbbra is javasoljuk, hogy minden fiókodhoz — tehát az RszMail-hez is — eltérő jelszót használj.

A nemkocka látogatók itt abbahagyhatják az olvasást, a kockáknak pedig még némi háttérinfó. 🙂

Nem lenne korrekt nem megemlíteni a posztban a Let’s Encrypt nevű kezdeményezést, amely lehetővé tette az oldal HTTPS-esítését. Ez a (nagy, neves szervezetekből összeállt) csoport a teljesen titkosított internetet tűzte a zászlajára, és ezért hajlandóak tenni is (és nem úgy, mint a böngészőfejlesztők, akik egyszerűen letiltják az egyes funkciókat titkosítatlan kapcsolaton keresztül -.-).

Our goal with Let’s Encrypt is to get the Web to 100% HTTPS.

"Ez derék dolog, srácok!"
“Ez derék dolog, srácok!”

A Let’s Encrypt által kiállított tanúsítvány ingyenes, de semmivel sem rosszabb a fizetős verzióknál — egyszerűen végre valaki felismerte, hogy amíg néhány nagy cég bevételi forrásként tekint az SSL tanúsítványokra, addig nem fog tömegesen elterjedni a biztonságos kapcsolat.

A teljesség kedvéért idekívánkozik a Get HTTPS for free! is, amely — bár a neve egy ájfonnyerős/lehúzós/átverős oldalt sejtet — a Let’s Encrypt egy felhasználóbarát** wrappere, és amely nélkül esélytelen lett volna a HTTPS-re való átállás. Persze biztosan bennem van a hiba, de az én cPanelhez szokott, tunya agyamnak még ez a wrapper is egy izzasztó akadályfutás volt, de a kemény munka meghozta a gyümölcsét, és végül sikerült megszerezni a tanúsítványt. 🙂

Ha Te is hasonló feladattal találod szembe magad, és hozzám hasonlóan megilletődsz az SSL, TLS, CSR és hasonló HBR-ek láttán, szólj, és szívesen segítek. 🙂

belyeg128

green_lantern
Nem veszlek be a posztomba.

Ui.: Ebbe a posztba valahogy bele akartam keverni A Zöld Lakat analógiájára a Zöld Lámpást is, de aztán arra jutottam, hogy számomra annyira szörnyű élményt nyújtott a film, hogy inkább nem riasztom el az amúgy is gyér közönségemet ilyen utalásokkal. Remélem, értékeled, hogy megkíméltelek ettől az erőltetett párhuzamtól. 🙂

*: ez bullshitnek hangzik, pedig nem az.

**: vagy nevezzük inkább kevésbé felhasználógyűlölőnek 🙂


Hogy mit honnan:

Nyomulunk!

tl;dr: Van push értesítés mobil és asztali Chrome-ra! Jejj!

kulka_orom
Kulka János is örül a push értesítéseknek.

Úgy kell, hogy:

  • bejelentkezel,
  • belépsz a Műszerfaladra,
  • legörgetsz a Push értesítések részhez,
  • ráböksz a nagy “Push értesítések beállítása” gombra,
  • megadod az eszközöd nevét,
  • bepipálod a “Kérek push értesítést…” jelölőnégyzetet,
  • ha megjelent alul valami hosszú, szürke szöveg, akkor
  • ráböksz a nagy “Mentés és bezárás” gombra,
  • és kész!

UPDATE: Ez egy kicsit megváltozott, most már közvetlenül a Műszerfaladon tudod kezelni a push értesítéseket.

Ha nemcsak ez, hanem a háttér is érdekel egy picit, akkor olvass tovább. Akkor és csak akkor.

Először is bocsánatot kérek a cím borzalmas szójátékáért, nem vagyok rá büszke. De hogyan lehetne másképp kezdeni egy push értesítésekről írt posztot? 🙂

nenyisd

Azért jó a cégünknél dolgozni, mert az ember sok hozzá hasonló, problémamegoldásra kihegyezett mérnökemberrel van körülvéve. Ha olvastad az előző bejegyzést, akkor tudhatod, hogy a push értesítések összerakásánál — akkor látszólag — áthatolhatatlan falba, a HTTPS hiányába ütköztem. Ezt nyilván nemcsak a blogon, hanem a munkahelyi beszélgetések alkalmával is elsírtam a többieknek, így kaptam egy remek tippet (kösz, Zoli!): a Firebase használatát. Ez egy olyan* szolgáltatás, ahová fel lehet tölteni egy webappot, amely aztán (most jön a — számomra — fontos rész!) HTTPS-en keresztül, a legújabb előírásoknak megfelelően lesz elérhető.

Bár a tipp úgy szólt, hogy dobjak el mindent, és költöztessem át az egész RszMail-t a Google által nyújtott platformra, én azért ennél egy fokkal óvatosabb voltam. Egyrészt már megvolt a teljes architektúra, nem akartam mindent elölről kezdeni, másrészt szeretem teljes egészében kézben tartani az oldal működését, a biztonságérzetemhez pedig még szükségem van az oldschool FTP-n feltöltős, cPanelen kattintgatós felületre (a Firebase ilyet nem ad).

Tehát a feladat az volt, hogy írjak egy, az RszMail-hez tartozó, azt kiegészítő webappot, amely technikailag teljesen független az RszMail központi részétől, és mindössze annyit tud, hogy feliratkoztatja a felhasználókat a push értesítésekre, és kezeli azokat. Szóval technikailag egy teljesen idegen alkalmazás értesítéseire kell feliratkozni, igen. 🙂

Természetesen a felhasználói élményt (van ilyen?!) meg kellett őrizni, ezért az app pontosan úgy néz ki, mint maga az RszMail, és arról is gondoskodnom kellett, hogy a külső app és a központi alkalmazás között sima legyen az átjárás. Ja, de ezzel azért ne is nyissak (nagy) biztonsági rést a rendszeren. Remélem, legalább ez utóbbi sikerült. (Várom a ‘; DROP TABLE Users; – nevű eszközöket…) 🙂

drop_table
Az ember úgy küzd a közúti bírságok ellen, ahogy tud…

Az ötlet végül csak félig jött be — a Firebase a Google push motorját, a Google Cloud Messaging-et használja (időközben átnevezték Firebase Cloud Messaging-re, és minden bizonnyal sokat alakítottak is rajta, de ez most mindegy), amely egyelőre (?) csak Android és iOS natív appokkal, illetve Chrome böngészővel működik. Szerencsére utóbbinak legalább mobil és asztali verziójával is.

Szóval jelenleg ott tartunk, hogy ha (viszonylag friss) Chrome-ot használsz**, akkor azonnal értesülhetsz a rendszámodra érkezett üzenetekről, akkor is, ha a levelezőkliensed nem pittyeg minden egyes új levélnél. Ez azért elég jó! 🙂

Természetesen van még hová fejlődni: implementálnom kell a Web Push API-t, ami már egy W3C-kompatibilis megoldás lesz, és akkor már Firefoxon, Safarin, meg minden egyeben fognak suhanni az értesítések (már ha maguk a böngészők is veszik a fáradságot, hogy szintén implementálják). Ehhez viszont kell az előző posztban említett HTTPS, szóval ez még egy kicsit arrébb van.

Hű, már 500 szó fölött járunk, lassan be kell zárni ezt a posztot. Pedig azt terveztem, hogy az RszMail (HTTP) – Firebase app (HTTPS) közötti átjárásról is írok! Meg a service workerekről, meg az általuk felmerülő kockázatokról, meg a meghiúsult AJAX hívásaimról, meg az XSS támadásokról, meg a CORS-ról, meg-meg-meg… De talán jobb is így, hogy nem, mert ez már tényleg csak a nagyon kockákat hozza lázba úgy, mint engem… Számomra nagyon érdekesek voltak ezek a témák! 🙂 De akkor erről majd személyesen, ha egy beszélgetés fonala úgy hozza…

belyeg128*: Nem, a Firebase ennél sokkal több, de nekem most ez volt a lényeg. Olvass utána, amúgy király dolog! 🙂
**: Persze csak állandó internetkapcsolattal rendelkező okostelefonról vagy számítógépről, csodát tenni nem tudunk.


Hogy mit honnan:

Hol éri ez meg?

Már többen kérdezték tőlem, hogy

Miért érte meg nekem kifejleszteni és miért éri meg fenntartani az oldalt?
Ha az oldal használata mindenkinek ingyenes, akkor honnan lesz bevételem?
Vagy valahol mégis el van dugva valamilyen költség?

Ha Benned is felmerültek ezek a kérdések, akkor hadd nyugtassalak meg: nincs eldugott költség, mára divatossá vált in-game-purchase vagy fizetős DLC.

Ez nincs.

De akkor mi az üzleti tervem? Hiszen azt mindenki tudja, hogy manapság már semmi nem létezhet üzleti terv nélkül. Vagy… vajon az RszMail-re is igaz, hogy “Ha nem találod a terméket, amit el akarnak adni neked, akkor te vagy a termék“?!

Nem, nem te vagy a termék. Itt tényleg nincs termék. És a legelső kérdésre válaszolva: ez nekem nem éri meg — anyagilag.

Az RszMail az én apró hozzájárulásom a fejlődéshez, egy közhasznú kezdeményezés, és mint ilyen, piaci alapokon nem állná meg a helyét. Tekinthetjük egy olyan biznisznek, ahol a befektetett munka és pénz nem több pénzt fog hozni, hanem odafigyelést, megkönnyebbülést, mosolyokat, nekem pedig ezen keresztül jó karmát. A nirvánára gyűjtök… 🙂

— Most kéregetés jön, akit ez zavar, az lapozzon a 317-re. —

https_koldusEnnek ellenére bolond lennék elhessegetni a segítő szándékot, ráadásul be kell látnom, hogy az igazán ütős szolgáltatások nem fognak menni további anyagi befektetés nélkül. Az első ötletem az SMS-küldés volt, de azt csak kb. 20 Ft-os darabáron tudnám megtenni, ennyi közhasznúság sajnos már nem fér bele. A másik irány, hogy inkább Push üzenetet küldök — a fogadásukra képes — felhasználóknak, azt meg tudom tenni ingyen.

— Kocka sírdogálás jön, akit ez zavar, az lapozzon a 276-ra. —

Igen ám, de a Push üzenetek meg nem hajlandóak átmenni titkosítatlan (nem HTTPS) kapcsolaton, szóval ehhez a feature-höz bizony SSL tanúsítványra van szükség. Nosza, szerezzünk hát egy tanúsítványt — ha pedig senki nem akar adni ingyen, akkor írjunk egy self-signed-ot.

Kis kitérő azoknak, akik egy kicsit kockák (ezért olvassák ezt), de nem nagyon kockák (ezért nincsenek képben a HTTPS-sel — megjegyzem, én sem, I’m not an IT guy). Aki képben van vele, az lapozzon a 42-re.

A HTTPS kapcsolat annyiban különbözik a sima HTTP-től (legalábbis az a lényeg), hogy a böngésző és a szerver közötti kommunikáció SSL-lel titkosított, azaz elvileg kívülről nem hallgatható le. Ilyen kapcsolat létrehozásához a szervernek fel kell tudnia mutatnia egy SSL tanúsítványt, ebben a tanúsítványban van az a kulcs, amely elrejti az adatokat a kíváncsi szemek elől, amíg azok a böngésző és a szerver között utaznak.

A tanúsítvány azonban még ennél is többet tud: igazolja, hogy a szerver tényleg az, akinek kiadja magát. Tehát nem csak azt biztosítja, hogy az adatok biztonságban legyenek, amíg a szerverhez kerülnek, azt is garantálja, hogy a megfelelő szerverhez kerüljenek.

Ezt az igazolást egy úgynevezett megbízható harmadik fél állítja ki és foglalja bele az SSL tanúsítványba (ezt hívják aláírásnak) — pénzért. Nincs is ezzel semmi baj addig, amíg a titkosítandó forgalom végül valamilyen bevételt generál, de az RszMail-lel nem ez volt a helyzet.

Na de még mindig nem volt minden veszve — létezik ugyanis egy lehetőség, amellyel akárki gyárthat magának SSL tanúsítványt, majd önmaga aláírhatja ezt, ezek lesznek a self-signed tanúsítványok. Ez kb. a csekkfüzetnek felel meg, amikor valakinek a bank igazolása nélkül is elhisszük, hogy elég pénze van ahhoz, hogy bármikor beválthassuk a tőle kapott csekket. A self-signed tanúsítványok tehát alkalmasak a titkosított kapcsolat felépítésére (az adatok biztonságosan utaznak…), de alkalmatlanok a szerver hitelt érdemlő azonosítására (… de lehet, hogy a rosszfiúkhoz). Ezt a legtöbb böngésző egy kövér figyelmeztetéssel szokta honorálni, de úgy voltam vele, hogy egy próbát megér a dolog, legfeljebb

  1. kiírom az oldalra, hogy “Léccilécci okézd le a nagy kövér biztonsági figyelmeztetést” (nem szép megoldás, de láttam már jó pár ilyet, a koliban meg aztán végképp mindennaposnak számított),
  2. így legalább biztosítok valamiféle titkosítást a pőre HTTP helyett (ezt a kocka látogatóim talán értékelték volna).

selfsigned
Ilyen lett volna az RszMail nyitólapja — különös, de ez jobb, mint a semmi

Ezen a ponton volt egy pár érdekes vitám az egyik munkatársammal, és be kell vallanom, nem tudok neki nem igazat adni. Mert ugye

HTTP HTTPS (self-signed tanúsítvánnyal)
megbízhatatlan szerver megbízhatatlan szerver
titkosítatlan kapcsolat titkosított kapcsolat
a felhasználó tudatában van a veszélynek biztonság hiányának a felhasználónak hamis biztonságérzete lehet

Ráadásul ha ráveszem a látogatóimat, hogy bízzanak meg csak úgy, vakon az én általam aláírt tanúsítványban, akkor azzal valójában arra nevelem az emberiséget, hogy ne követeljék meg a tényleges, ellenőrizhető tanúsítványok használatát — ami viszont épp az egész tanúsítvány-sztori alapja. Ezzel a lépésemmel lehet, hogy több kárt tennék, mint amennyit segítek a titkosított adatforgalommal.

Szóval lehetne itt elmélkedni, hogy jobb-e az egyértelmű “fenyegetettségnél” a hamis biztonság egy kis tényleges biztonsággal megtoldva, de… (kis kitérő vége)

42. Nem árulok el nagy titkot, ha azt mondom, hogy sajnos egyáltalán nem jött össze a HTTPS. Történt ugyanis, hogy miután jó pár órát beleöltem abba, hogy megcsináljam a self-signed tanúsítványomat (mondtam már, hogy én csak egy egyszerű villamosmérnök vagyok?), kiderült, hogy nem tudom használni, mert az oldal egy shared-hosting tárhelyen ül. Hogy ez miért probléma, az már bőven túlmutat ezen a poszton (igazából az előző bekezdések is), de akit érdekel, az guglizzon rá, én már belefáradtam a küzdelembe.

— Itt van vége a kocka sírdogálásnak. —

Szóval egyelőre marad a HTTP. Ez a Push üzeneteken kívül csak egy dolgot érint érzékenyen: a jelszavakat.

Amikor ezt a posztot írom, már lecsengett a BSI-jelszóbotrány. Természetesen nagy baj, hogy egy ilyen nagy oldal olyan alapvető védelmi intézkedést nem tartott be, hogy jelszavakat soha nem tárolunk kódolatlanul (az RszMail-nél ez pipa: “A jelszavadhoz nem férünk hozzá, azt csak kódoltan tároljuk. Ezért ha elfelejted a jelszavadat, újat kell kérned, a régit nem tudjuk elárulni. [egvemaradt.hu/info.php]”), de azért egyvalamire mégiscsak jó volt: a felhasználókat is ráébresztette (talán), hogy milyen fontos eltérő jelszavakat használni a különböző oldalakon.

Mi szóltunk...
Az RszMail jelszóváltoztató felülete. Mi szóltunk…

Hm… Egy kicsit elkalandoztam a poszt eredeti kérdésétől, de azt hiszem, ezt most megengedem magamnak, és nem szerkesztem át az egészet. Végül is ez az egész HTTPS-dolog elég jól alátámasztja a kéregetős vonalat, nem?

paypal
Itt lehet adományozni

Végezetül annyit még, hogy van az RszMail-nek PayPal fiókja, amire lehet küldeni adományokat. Ezekkel négy dolog történhet (nagyjából ebben a prioritási sorrendben):

  • szerverbérlésre költöm
  • SSL tanúsítványra költöm
  • elmulatom a srácokkal, akik segítenek nekem a fejlesztésben (erről majd később)
  • az RszMail népszerűsítésére költöm (lesz repi, erről is később UPDATE: már van! 🙂 )

— Itt van vége a kéregetésnek. —

Nos, hát ez lenne a nagy “üzleti tervem”. A köz javára tenni, közben a technológiával bosszankodni, és közben tanulni, tanulni, tanulni. 🙂

Учиться учиться и еще раз учиться

Ez itt a poszt vége, nem kell tovább olvasnod. 🙂

belyeg128

276. Megpróbálod válladdal betörni az ajtót, de meghallod a közeledő troglodyták rikácsoló hangját. Csapdában vagy. Előhúzod kardodat, de a troglodyták körülvesznek, megfeszítik íjukat és nyílzápor zúg feléd, mely végez veled. Élettelen tested a Halállabirintus mélyének földjére hull.

317. Kardoddal kitapintva a vágat oldalát, vakon botorkálsz előre a csúszós iszapban. Mintha időtlen idők óta követnéd kanyarjait és hajlatait, és kíváncsi vagy, hová vezet. Hirtelen meghallod, hogy valami csúszik előtted. Megdermedsz a félelemtől, kétségbeesetten meresztgeted a szemedet a koromfekete sötétségben. Mielőtt felfoghatnád, mi is történik, egy újabb Sziklahernyó állkapcsa ragadja meg a nyakadat. Annak a Sziklahernyónak a társa ez, amellyel végeztél, és a kardodon levő vér szaga vonzotta. Egyre keményebben szorít, míg végül nyaki csigolyád úgy pattan el, mint egy vékony gally. Kalandod itt véget ér.


Hogy mit honnan:

  • DLC magyarázat: imgur
  • Sziklahernyó és troglodyták: Ian Livingstone: Halállabirintus (brutális volt, mindig meghaltam benne, a traumát máig nem tudtam feldolgozni) 🙂
  • Őszinte crowdfunding-hipster a Pinterestről
  • Kövér figyelmeztetés a Super Userről
  • “Учиться учиться и еще раз учиться” от Ленина