Zum Inhalt springen

Honeypot-Experiment

2026-08-24-srv3-dionaea-mongod-parser-freeze

Innerhalb eines Monats Betrieb sind mehrere Dinge kaputtgegangen – einiges wurde vom Agenten, einiges vom Anbieter und einiges vom Betreiber beschädigt. Zu jedem Vorfall gibt es eine eigene Analyse mit einer Zeitleiste, der Ursache und einer Auflistung der verlorenen Gegenstände.

Analyse aktualisiert: 02.10.2026 20:00:00 UTC+02:00

Problem melden
Zurück zur Übersicht der Vorfälle

Übersicht über den Vorfall #


Es fehlen Daten Schweregrad: ernst Verursacht: Agent gelöst
Bezeichnung
2026-08-24-srv3-dionaea-mongod-parser-freeze
Anfang
24.08.2026 16:18:29 UTC
Festgestellt
24.08.2026 18:42:41 UTC (nach 2 h 24 min)
Man begann, sich damit zu befassen
24.08.2026 18:48:25 UTC (6 min nach der Feststellung)
Gelöst
07.09.2026 20:07:31 UTC
Länge
14 d 3 h
Ursache
mongod_parser_infinite_loop belegt
Wer hat das bemerkt?
Agent
Betroffene Server
srv3
Auswirkung
Datenerhebung, Verfügbarkeit
Eingriffe des Bedieners
0
Offene Fragen
7
  • bis zur Feststellung
  • Zum Anfang der Lösung
  • bis zur Klärung
Beginn 16:18Gelöst 20:07Festgestellt um 18:42 (nach 2 h 24 min)Die Bearbeitung begann um 18:48 (6 min nach der Feststellung)

Auswirkungen auf Honeypots und Daten #


Reaktionen der Agenten

Server Reaktion
srv3 traf

Lücken in den Daten

VonBisLängeServerDatenstromErneuerbareAktualisiert
24.08.2026 16:18:29 UTC24.08.2026 18:48:28 UTC2 h 30 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
25.08.2026 09:41:00 UTC25.08.2026 10:04:00 UTC23 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
27.08.2026 00:33:00 UTC27.08.2026 00:54:00 UTC21 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
27.08.2026 18:33:00 UTC27.08.2026 18:54:00 UTC21 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
28.08.2026 08:48:00 UTC28.08.2026 09:09:00 UTC21 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
28.08.2026 12:08:00 UTC28.08.2026 12:31:00 UTC23 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
28.08.2026 12:34:00 UTC28.08.2026 13:01:00 UTC27 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
28.08.2026 20:42:00 UTC28.08.2026 20:51:30 UTC10 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
31.08.2026 13:13:40 UTC31.08.2026 13:26:04 UTC12 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
31.08.2026 14:12:42 UTC31.08.2026 14:22:03 UTC9 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
31.08.2026 16:35:03 UTC31.08.2026 16:46:09 UTC11 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
01.09.2026 04:10:00 UTC01.09.2026 04:20:29 UTC10 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
01.09.2026 07:22:00 UTC01.09.2026 07:32:36 UTC11 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
01.09.2026 07:57:00 UTC01.09.2026 08:03:21 UTC6 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
02.09.2026 08:16:00 UTC02.09.2026 08:26:03 UTC10 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
07.09.2026 17:35:36 UTC07.09.2026 17:44:17 UTC9 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
07.09.2026 18:23:40 UTC07.09.2026 18:26:20 UTC3 minsrv3dionaea (všechny emulované protokoly)neinnicht erneuert
28.08.2026 18:52:50 UTC16.09.2026 00:00:00 UTC18 d 5 hsrv3dionaea SIP (5060) — emulace vypnutaneinnicht erneuert

Die Lücken von hier werden automatisch in die Liste auf der Seite übernommen Einschränkungen

Änderungshistorie der Analyse #


Die Analyse wird nicht stillschweigend überschrieben: Jede Änderung wird im Abschnitt Änderungen

Die Analyse hat sich seit der Veröffentlichung nicht geändert.

Analyse #


Die Analyse ist in der Sprache dieser Seite nicht verfügbar. Es wird die Version in der Sprache Tschechisch angezeigt – es handelt sich nicht um eine Übersetzung.

Verfügbare Sprachen für die Analyse: Tschechisch

Dionaea opakovaně zamrzala kvůli nekonečné smyčce v parseru MongoDB

Všechny časy jsou v UTC. Rozbor slučuje záznamy pěti relací agenta (kontroly č. 2 až 6, 24. 8. – 7. 9. 2026). Značky zdroje: [VIDĚL] doslova v záznamu · [ODVOZENO] závěr z viděného · [NEJISTÉ] jen přibližně nebo nedohledatelné

1. Shrnutí

Modul mongod v dionaee (port 27017) parsuje příchozí data smyčkou, která posouvá offset o délku převzatou z hlavičky paketu, aniž by ji ověřila. Když deklarovaná délka vyjde menší než 16 bajtů, offset se neposune a smyčka se točí donekonečna. Dionaea je jednovláknová, takže zamrzne celý senzor: všech 14 publikovaných portů přestane odpovídat, zatímco jádro dál dokončuje TCP handshake a docker ps hlásí kontejner jako Up. [VIDĚL] zdrojový kód a reprodukce.

Mezi 24. 8. a 7. 9. 2026 senzor zamrzl nejméně sedmnáctkrát, od necelých tří minut po 2,5 hodiny. Dohromady chybí přibližně 6 hodin 17 minut dat ze všech protokolů dionaey; data z těchto oken nejsou obnovitelná, raw pakety externího provozu ze stejných časů jsou v pcapu. [ODVOZENO] součet oken v sekci 4. Kontroly č. 2 až 5 příčinu nenašly a vystřídaly několik mylných hypotéz. Na základě jedné z nich (busy-loop v SIP modulu) kontrola č. 3 28. 8. v 18:52:50Z vypnula SIP emulaci. Zamrzání to nezastavilo, ale od té chvíle do konce běhu dionaea neloguje žádné SIP dialogy. [VIDĚL]

Příčinu našla až kontrola č. 6 dne 7. 9.: gdb ukázal smyčku uvnitř interpretu Pythonu, čtení zdrojáku odhalilo nekontrolovaný posun offsetu, mechanismus byl reprodukován šestnácti nulovými bajty (samostatný incident 2026-09-07-srv3-deliberate-dionaea-freeze-repro) a doplněn guard if h.messageLength < 16: break. Stav na konci experimentu: opraveno a ověřeno 7. 9. ve 20:07–20:09Z. Po tomto okamžiku neexistuje žádné pozorování serveru, takže opakování z jiné příčiny nelze vyloučit.

2. Časová osa

Čas (UTC)KomponentaCo se staloZdroj
2026-08-22T00:15:21ZdionaeaVytvořen kontejner dinotools/dionaea:latest s vadným modulem mongod[VIDĚL] docker inspect
2026-08-22T22:49:23ZdionaeaRestart při zařazení SIP/RTP do deny listu streamdumperu; zamrznutí nebylo doloženo[VIDĚL] CHANGELOG
2026-08-24T16:18:29ZdionaeaPoslední událost v dionaea.json před prvním zamrznutím[VIDĚL]
2026-08-24T16:18:32Zdionaeadionaea.log zahlcen 3938 řádky sip … Cleanup, poslední useknutý[VIDĚL]
2026-08-24T16:18Z–18:48Zhp-watchdog~50 běhů, všechny "actions":"none", kontrola jen stavu kontejneru[VIDĚL] state.jsonl
2026-08-24T18:42:41ZagentKontrola č. 2: hodinové počty končí v hodině 16; top 100 % CPU, 841 MB RES[VIDĚL]
2026-08-24T18:48:25Zagentdocker restart -t 10 dionaea; první událost 18:48:28Z[VIDĚL]
2026-08-24T~18:54Zhp-watchdogNové liveness sondy: dionaea.json ≥ 20 min + MySQL pozdrav na 3306; throttle 1 restart / 30 min[VIDĚL]
2026-08-25T10:03:43Zhp-watchdogliveness_restart:dionaea, age_min 22[VIDĚL]
2026-08-27T00:53:32Z, 18:53:07Zhp-watchdogDva restarty, age_min 20[VIDĚL]
2026-08-28T09:08:56Z, 12:30:04Zhp-watchdogDva restarty, age_min 21 a 22[VIDĚL]
2026-08-28T12:53:55Z, 12:56:55Zhp-watchdogliveness_throttled:dionaea — rejam do ~4 min po restartu, throttle restart zablokoval[VIDĚL]
2026-08-28T13:00:05Zhp-watchdogRestart po vypršení throttlu, age_min 26[VIDĚL]
2026-08-28T18:52:50ZagentKontrola č. 3: sip.yaml → sip.yaml.disabled-20260828, restart; práh 20 → 9 min[VIDĚL]
2026-08-28T20:51:24Zhp-watchdogRestart — první důkaz, že SIP nebyl příčinou[VIDĚL]
2026-08-31T13:25:01Z, 14:22:02Z, 16:46:08Zhp-watchdogTři restarty[VIDĚL]
2026-08-31T20:29:28ZagentKontrola č. 4: detekce přes frontu nepřijatých spojení, diagnostický dump před restartem, práh 9 → 6 min[VIDĚL]
2026-09-01T04:20:29Z, 07:32:36Z, 08:03:21Zhp-watchdogTři restarty; v 08:00:16Z liveness_throttled[VIDĚL] state.jsonl
2026-09-02T08:26:03Zhp-watchdogRestart; pátý dump[VIDĚL]
2026-09-04T18:02–18:15ZagentKontrola č. 5: dumpy ukazují busy loop v userspace; sběr rozšířen o syscall sampling, strace, gdb[VIDĚL]
2026-09-07T17:35:36ZdionaeaPoslední událost před zamrznutím; předcházely sondy \xffSMB a MMS na 27017[VIDĚL] pcap, dionaea.json
2026-09-07T17:44:16Zhp-watchdogRestart (dump 17:43:56Z, json age 8min)[VIDĚL]
2026-09-07T18:23:40ZdionaeaPoslední událost před dalším zamrznutím[VIDĚL]
2026-09-07T18:26:20Zhp-watchdogRestart (dump 18:25:58Z, json age 2min)[VIDĚL]
2026-09-07T20:06:16ZagentReprodukce 16 nulovými bajty na 27017 (samostatný incident)[VIDĚL]
~2026-09-07T20:07:19ZagentNasazen patch do mongo.py, restart[ODVOZENO] z Up 12 seconds ve 20:07:31Z
2026-09-07T20:07:31ZdionaeaOpravený kontejner běží; regresní test ve ~20:08Z neprošel do smyčky[VIDĚL]

Nesrovnalosti a mezery: u epizod 25. 8. – 2. 9. nejsou v záznamu začátky zamrznutí, jen časy restartů. Začátky jsou dopočítané z age_min watchdogu (±2 min), u 31. 8. z výpisu mezer nad dionaea.json (počítáno nad nesetříděnými značkami, posun až o jednotky sekund) a u 1.–2. 9. odhadem podle utime v dumpech. Přesné hranice je nutné doměřit z dionaea.json v archivu. [NEJISTÉ]

3. Příčina

dionaea/mongo/mongo.py: handle_io_in posouvá offset o hodnotu z paketu bez kontroly
  └─ příchozí buffer >= 16 B, jehož hlavička deklaruje messageLength < 16
       └─ offset = offset + messageLength offset nezmění
            └─ while len(data) - offset >= 16 je trvale pravda -> nekonečná smyčka v hlavním vlákně
                 └─ dionaea je jednovláknová -> zamrzne CELÝ senzor, všech 14 portů
                      └─ jádro dál dokončuje TCP handshake, aplikace neodpovídá a nic neloguje
                           └─ v datech chybí všechny události dionaey až do restartu watchdogem

Původní smyčka [VIDĚL]:

    def handle_io_in(self, data):
        offset = 0
        while len(data) - offset >= 16:
            h = packets.MsgHeader(data[offset:offset+16])
            if len(data) - offset < h.messageLength:
                break
            if h.opCode == 2004:
                ...
            elif h.opCode == 2010:
                ...
            # ToDo: check length
            offset = offset + h.messageLength

Komentář # ToDo: check length je v upstreamovém kódu dionaey. Mechanismus je potvrzený reprodukcí. [VIDĚL]

Co potvrzené není:

  • Spouštěč v reálném provozu. Filtr na pakety s nulovými prvními čtyřmi bajty na 27017 nenašel ve třech hodinových pcapech nic. Hypotéza 1: šestnáctibajtové okno s nulovou délkou vzniká až na hranici spojovaných paketů. Hypotéza 2: spouštějí ho servisní sondy typu nmap -sV (\xffSMB, MMS, GET, OPTIONS) — obě zamrznutí ze 7. 9. jim předcházela do ~30 s. Jde o korelaci na dvou případech, ne o důkaz. [ODVOZENO]
  • Zda šlo vždy o tutéž vadu. Diagnostické dumpy existují až od 1. 9. Epizoda z 24. 8. měla jiné projevy než dumpy ze 7. 9.: log zahlcený 3938 řádky sip /dionaea/sip/__init__.py:45-warning: Cleanup a RSS 841 MB, zatímco 7. 9. log nic nezahlcovalo a RSS bylo 228–350 MB. Není tedy vyloučeno, že 24. 8. (případně i 25.–28. 8.) šlo o jinou smyčku v SIP modulu. Přiřazení těchto epizod k parseru Monga je odvozené. [NEJISTÉ]

Mylné hypotézy a jejich cena

  1. SIP modul (kontroly č. 2 a 3). Opřeno o zahlcený log z 24. 8. Kontrola č. 3 po šesti restartech za tři dny SIP emulaci vypnula, přestože HANDOVER doporučoval spíš nechat watchdog restartovat. Zamrznutí pokračovala už 28. 8. ve 20:51Z. Cena: trvalá ztráta SIP dialogů v dionaea.json od 28. 8. 18:52:50Z do konce běhu. Port 5060 zůstal publikovaný, host od té doby vracel refused. [VIDĚL]
  2. Vyčerpání zdrojů (kontrola č. 4). Měřením vyloučeno: fd 23 z 1 048 576, conntrack 628 z 262 144, RSS 91 MB z 3 GB, quick_check: ok, port 3306 ~40 skutečných spojení denně. [VIDĚL]
  3. Parser SMB / deadlock vláken (kontroly č. 4 a 5). Dumpy deadlock vyvrátily (hlavní vlákno R, wchan=0, ~100 % CPU, šest vláken glib poolu nečinně ve futexu, utime:stime ~88:12). SMB hypotéza stála na chybném předpokladu, že poslední zalogovaný accept ukazuje na viníka. [VIDĚL]

Proč to nezachytila ochrana

  • Do 24. 8. kontroloval watchdog jen stav kontejneru, který byl celou dobu running. První zamrznutí proto trvalo 2,5 hodiny a našel ho agent ručně. [VIDĚL]
  • Práh detekce = minimální ztráta. S prahem 20 min stála každá epizoda 25.–28. 8. ~21–27 minut; po snížení na 9 min ~10 minut; po přechodu na frontu nepřijatých spojení (31. 8.) jednotky minut. [VIDĚL]
  • Throttle 1 restart / 30 min nechal senzor slepý 28. 8. 12:34–13:01Z a 1. 9. kolem 08:00Z, přestože watchdog zamrznutí správně detekoval. [VIDĚL]
  • Opakování se nikam neeskalovalo. Šest restartů za tři dny leželo v state.jsonl, dokud si jich nevšimla ruční kontrola. RestartCount zůstal 0, protože restarty dělal watchdog příkazem. [VIDĚL]
  • Restart ničil důkazy. Do 31. 8. watchdog zamrzlý proces zabil bez záznamu stavu; dumpy vznikají až od 1. 9., gdb až od 4. 9. [VIDĚL]

4. Dopad a díry v datech

Co vypadlo

  • Všechny publikované porty dionaey (21, 135, 445, 1433, 1723, 1883, 3306, 9100, 11211, 27017/tcp a 69, 1900/udp, do 28. 8. i 5060) při každém zamrznutí naráz. Doloženo timeoutem MySQL na 3306 při reprodukci směrované na 27017. [VIDĚL]
  • Všechny výstupy dionaey: dionaea.json, dionaea.log, dionaea.sqlite, lib/bistreams, binaries. [ODVOZENO] — plní je tentýž zamrzlý proces.
  • Syslogový stream dionaey (imfile čte dionaea.json). [ODVOZENO]
  • SIP dialogy od 28. 8. 18:52:50Z do konce běhu. [VIDĚL] 0 záznamů SipSession po 18:53Z.

Co nevypadlo

  • Cowrie, webtrap-http, webtrap-https, sink — samostatné kontejnery, při všech kontrolách čerstvé události. [VIDĚL]
  • pcap na eth0 — samostatná služba, během zamrznutí zapisovala dál. Pozor: 24. 8. ještě se snaplenem 256 B, viz 2026-08-22-srv3-pcap-ring-buffer-snaplen. [VIDĚL]
  • Řídicí kanál, rsyslog forward, záloha operátora, disk — bez dopadu. [VIDĚL]
  • Data mimo okna — dionaea.sqlite neporušená ani po opakovaných SIGKILL. [VIDĚL]

Díry a vady v datech

Soubor / streamPoleOdDoCharakterNenávratné?Kde jsou data kompletní
dionaea (vše)všechna2026-08-24T16:18:29Z2026-08-24T18:48:28Zchybíanopcap (jen raw pakety, snaplen 256)
dionaea (vše)všechna~2026-08-25T09:41Z~2026-08-25T10:04Zchybíanopcap
dionaea (vše)všechna~2026-08-27T00:33Z~2026-08-27T00:54Zchybíanopcap
dionaea (vše)všechna~2026-08-27T18:33Z~2026-08-27T18:54Zchybíanopcap
dionaea (vše)všechna~2026-08-28T08:48Z~2026-08-28T09:09Zchybíanopcap
dionaea (vše)všechna~2026-08-28T12:08Z~2026-08-28T12:31Zchybíanopcap
dionaea (vše)všechna~2026-08-28T12:34Z~2026-08-28T13:01Zchybíanopcap
dionaea (vše)všechna~2026-08-28T20:42Z2026-08-28T20:51:30Zchybíanopcap
dionaea (vše)všechna2026-08-31T13:13:40Z2026-08-31T13:26:04Zchybíanopcap
dionaea (vše)všechna2026-08-31T14:12:42Z2026-08-31T14:22:03Zchybíanopcap
dionaea (vše)všechna2026-08-31T16:35:03Z2026-08-31T16:46:09Zchybíanopcap
dionaea (vše)všechna~2026-09-01T04:10Z2026-09-01T04:20:29Zchybíanopcap
dionaea (vše)všechna~2026-09-01T07:22Z2026-09-01T07:32:36Zchybíanopcap
dionaea (vše)všechna~2026-09-01T07:57Z2026-09-01T08:03:21Zchybíanopcap
dionaea (vše)všechna~2026-09-02T08:16Z2026-09-02T08:26:03Zchybíanopcap
dionaea (vše)všechna2026-09-07T17:35:36Z2026-09-07T17:44:17Zchybíanopcap hp-20260907T165534Z.pcap
dionaea (vše)všechna2026-09-07T18:23:40Z2026-09-07T18:26:20Zchybíanopcap hp-20260907T175534Z.pcap
dionaea SIP (5060)SipSession2026-08-28T18:52:50Zkonec běhuchybí (emulace vypnuta)anopcap, port 5060, plná délka paketů
dionaea.logposlední řádek před restartem2026-08-242026-09-07T20:07Zpoškozený formát — useknutý (SIGKILL zahodil buffer)anonikde
dionaea.logcelý řádek2026-08-31T16:16:45Z2026-08-31T16:46:08Zpoškozený formát — useknutý a slepený se startovní hláškouanonikde
dionaea.log, dionaea-errors.log—2026-08-24T16:18:32Z2026-08-24T18:48:25Zbalast — 3938 řádků Cleanup s jednou značkoune—
dionaea.logcelý řádek2026-09-07T17:44:16Z2026-09-07T18:25:58Zchybí — žádné řádky, ač dionaea.json zapisovalanodionaea.json (jen události)
pcap × dionaea.jsonkorelace2026-08-242026-09-07T20:07Znavázaná TCP spojení bez události — výpadek senzoru, ne ztráta logune—
data/watchdog/state.jsonldionaea_q~2026-08-22T12:53Z2026-08-31T20:29:28Zpole chybí (změna schématu)ne—
dionaea.jsonsrc_ip = 169.58.205.217, port 33062026-08-24T~18:54Zkonec běhuvlastní provoz — MySQL sonda watchdogu, hustší od 31. 8. 20:29Zne (odfiltrovat)—

Okna s ~ mají odhadnutý začátek. Součet sedmnácti oken je přibližně 6 h 17 min, z toho 2,5 h připadá na 24. 8. [ODVOZENO]

Jak incident poznat v datech

  • data/watchdog/state.jsonl: řádky s "actions":"liveness_restart:dionaea" nebo liveness_throttled:dionaea. Nejspolehlivější index epizod od 24. 8. večer.
  • data/watchdog/dionaea-hang-*.txt: sedm dumpů (1. 9. čtyři, 2. 9. jeden, 7. 9. dva). Název nese čas potvrzení v UTC; časy ve výpisu ls jsou CEST.
  • dionaea.json: skoková mezera v timestamp a po ní shluk "type": "accept" ve stejné sekundě (naráz přijatá fronta). Značky nejsou monotónní — před hledáním mezer setřídit.
  • dionaea.log: useknutý poslední řádek před mezerou, např. [07092026 17:34:51] SMB /dionaea/smb/smb.py:1.
  • Konec SIP: poslední SipSession přibližně 2026-08-28T18:52Z; v syslogu zpráva tagu hp-check začínající check-3: disabling dionaea SIP emulation.

Jak s tím zacházet při zpracování

  1. Okna vyříznout z jmenovatele, ne interpolovat. Statistiky dionaey (události za hodinu, podíly portů, unikátní IP) počítat nad časovou osou bez těchto oken, jinak zamrznutí vypadá jako útlum útoků.
  2. Hranice oken s ~ doměřit z archivu: poslední timestamp v dionaea.json před každým restartem je skutečný začátek.
  3. Dionaeu nepoužívat pro tvrzení o denním rytmu útoků — výpadky nejsou rozložené rovnoměrně. Pro to použít cowrie, sink nebo pcap.
  4. SIP analyzovat odděleně před a po 2026-08-28T18:52:50Z; potom výhradně z pcapu. Propad na nulu je zásah agenta, ne změna chování útočníků.
  5. Zlom 7. 9. 20:07Z: od té doby běží dionaea s úpravou oproti upstreamu.
  6. Poslední řádek dionaea.log před mezerou zahodit; parser má dělit záznamy podle vzoru [DDMMYYYY HH:MM:SS], ne podle odřádkování.
  7. Parser state.jsonl nesmí vyžadovat dionaea_q.
  8. Odfiltrovat src_ip = 169.58.205.217 na portu 3306 (sondy watchdogu) a na portech 21, 445, 3306, 1883, 5060 v okamžicích kontrol (24. 8. ~18:43–18:49Z, 28. 8. ~18:53Z, 31. 8. 20:22:49Z).
  9. Pro okna zamrznutí sáhnout po pcapu, ale doplněná spojení držet jako zvláštní vrstvu — emulované odpovědi, bistreamy ani vzorky v nich nevznikly.

Záznam do seznamu omezení datasetu

Senzor dionaea mezi 24. 8. a 7. 9. 2026 nejméně sedmnáctkrát zamrzl kvůli nekonečné smyčce v parseru protokolu MongoDB a v těchto oknech, dohromady přibližně 6 hodin, nezaznamenal nic z žádného ze svých portů; chybějící události nejsou obnovitelné, raw pakety z týchž oken jsou v pcapu. Od 28. 8. 2026 18:52:50 UTC navíc dionaea neemulovala SIP, takže SIP dialogy od té doby v datech chybí a SIP provoz je zachycen jen v pcapu.

5. Reakce agentů

Agent incident nenašel prvotně automaticky: první zamrznutí objevil 24. 8. při kontrole č. 2 až po 2,5 hodinách, další hlásil watchdog, který si agent sám postavil. Čtyři kontroly přinesly tři hypotézy, z nichž dvě byly mylné; jedna vedla k zásahu s trvalou ztrátou dat (vypnutí SIP). Kontrola č. 4 se tomuto vzorci vědomě vyhnula („neopakovat postup kontroly č. 3") a místo dalšího vypínání modulů začala sbírat důkazy před restartem. Kontrola č. 6 příčinu doložila, reprodukovala a opravila.

Kontrola č. 2 (24. 8.)

  • 18:42:41Z — jq -r '.timestamp[0:13]' dionaea.json | sort | uniq -c, tail dionaea.log — jen čtení [VIDĚL]
  • 18:42:53Z — top, /proc/$pid/status, sondy exec 3<>/dev/tcp/169.58.205.217/$p na 21, 445, 3306, 1883 — čtení + testovací spojení [VIDĚL]
  • 18:48:25Z — logger -t hp-check "check-2: restarting dionaea …"; docker restart -t 10 dionaea — měnilo [VIDĚL]
  • ~18:54Z — watchdog přepsán: liveness sonda probe_dionaea (MySQL pozdrav) při stáří logu ≥ 20 min, throttle — měnilo [VIDĚL]
  • ~20:55Z — docker update --memory 3g --memory-swap 3g dionaea — měnilo [VIDĚL]

Kontrola č. 3 (28. 8.)

  • ~18:52:50Z — mv sip.yaml sip.yaml.disabled-20260828 + docker restart -t 5 dionaea — měnilo, trvalá ztráta SIP dialogů [VIDĚL]
  • ~18:53:05Z — ověřovací sondy na 3306, 21, 445, 5060 z 169.58.205.217 — vlastní provoz v datech [VIDĚL]
  • ~18:53:40Z — práh age_dionaea 20 → 9 min, záloha hp-watchdog.sh.bak-20260828 — měnilo [VIDĚL]

Kontrola č. 4 (31. 8.)

  • 20:22:49Z — 10× MySQL sonda na 3306 — 10 umělých spojení v datech [VIDĚL]
  • ~20:26Z — mezivarianta watchdogu se sondou při každém běhu, ve 20:28:22Z poslala jednu sondu; zavržena, protože by ~480 umělých spojení denně převážilo ~40 skutečných — měnilo a vráceno [VIDĚL]
  • 20:29:28Z — finální watchdog: fronta nepřijatých spojení (Recv-Q ≥ 5), MySQL sonda jen pro potvrzení, práh 6 min, pole dionaea_q, dump před restartem — měnilo [VIDĚL]

Kontrola č. 5 (4. 9.)

  • ~18:06Z — apt-get install -y -qq strace gdb — měnilo [VIDĚL]
  • ~18:07Z — do diagnostiky přidán syscall sampling, strace -c -f, gdb backtrace — měnilo [VIDĚL]
  • 18:09:03Z — test diagnostiky proti zdravé dionaee, ta byla ~11 s pozastavená — měnilo [VIDĚL]

Kontrola č. 6 (7. 9.)

  • ~19:57–20:05Z — čtení dumpů, tcpdump -nr nad pcapy, docker exec dionaea sed -n '155,235p' …/mongo/mongo.py — jen čtení [VIDĚL]
  • dvakrát — pokus spustit parser mimo dionaeu, selhalo na ImportError … undefined symbol: traceable_sustain_timeout_cb — nic neměnilo [VIDĚL]
  • 20:06:16Z — reprodukce, viz samostatný incident — měnilo [VIDĚL]
  • ~20:07:19Z — docker cp /tmp/mongo.py.new dionaea:/opt/dionaea/lib/dionaea/python/dionaea/mongo/mongo.py + docker restart -t 5 dionaea — měnilo [VIDĚL]
  • ~20:08Z — regresní test (3× 16 nulových bajtů + nmap sondy), záloha mongo.py.patched-20260907 na hostiteli, zápis do HANDOVER.md — měnilo [VIDĚL]

Watchdog agent po opravě záměrně nezměnil a nechal ho jako záchrannou síť. [VIDĚL]

6. Zásahy operátora

Žádné.

7. Otevřené otázky

OtázkaKde to ověřit v archivu
Jaké jsou přesné začátky oken označených ~?data/dionaea/log/dionaea.json a rotované kopie — poslední timestamp před každým restartem (po setřídění)
Jaká bajtová sekvence spouštěla zamrznutí v reálném provozu?data/pcap/hp-20260907T165534Z.pcap a hp-20260907T175534Z.pcap, TCP streamy na 27017 před 17:35:36Z a 18:23:40Z
Byla epizoda z 24. 8. (a 25.–28. 8.) tatáž vada, nebo smyčka v SIP modulu?dionaea.log kolem 2026-08-24T16:18Z; pcap hp.pcap04–hp.pcap05 na UDP/5060 a TCP/27017 před 16:18:29Z
Opakovalo se zamrznutí po opravě (7. 9. 20:07Z – 16. 9.)?data/watchdog/state.jsonl, liveness_restart:dionaea po 2026-09-07T20:07Z
Existuje obdobná smyčka v jiném modulu (epizody 1. 9. končily shlukem mssqld na 1433)?data/watchdog/dionaea-hang-20260901T*.txt, pcap na port 1433
Proč po restartu 24. 8. nepřišel FTP banner, když MySQL odpovídal?dionaea.log po 2026-08-24T18:48Z, pcap port 21
Kolik SIP provozu přišlo po vypnutí emulace?data/pcap/hp-2026*.pcap od hp-20260828T185359Z.pcap, filtr port 5060

8. Důkazy

24. 8. — hodinové počty končí v hodině 16 (pořízeno 18:42:41Z):

    687 2026-08-24T13
   2537 2026-08-24T14
    221 2026-08-24T15
     96 2026-08-24T16

24. 8. — zahlcený a useknutý dionaea.log, stav procesu:

[24082026 16:18:32] sip /dionaea/sip/__init__.py:45-warning: Cleanup
[24082026 16:18:32] si
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
  62810 debian    20   0 4093452 841908  16116 R 100.0   6.9 238:17.46 dionaea

25.–28. 8. — zásahy watchdogu (výňatek, pořízeno 28. 8. 18:48Z):

{"ts":"2026-08-25T10:03:43Z",…,"age_min":{"cowrie":0,"dionaea":22,"webtrap":3,"sink":1},"actions":"liveness_restart:dionaea"}
{"ts":"2026-08-28T12:30:04Z",…,"age_min":{"cowrie":3,"dionaea":22,"webtrap":1,"sink":6},"actions":"liveness_restart:dionaea"}
{"ts":"2026-08-28T12:53:55Z",…,"age_min":{"cowrie":0,"dionaea":20,"webtrap":21,"sink":3},"actions":"liveness_throttled:dionaea"}
{"ts":"2026-08-28T13:00:05Z",…,"age_min":{"cowrie":0,"dionaea":26,"webtrap":27,"sink":3},"actions":"liveness_restart:dionaea"}

31. 8. — mezery v dionaea.json a slepený řádek logu:

gap 2026-08-31T13:13:40 -> 2026-08-31T13:26:04 (12 min)
gap 2026-08-31T14:12:42 -> 2026-08-31T14:22:03 (9 min)
gap 2026-08-31T16:35:03 -> 2026-08-31T16:46:09 (11 min)
[31082026 16:16:45] SMB /dionaea/smb/smb.py:127-warning: p.haslayer(Raw): b'PATH_REPLACE[31082026 16:46:08] pptp /dionaea/pptp/pptp.py:52-warning: No config provided. Using default values

1. 9. — první diagnostický dump (dionaea-hang-20260901T042018Z.txt):

=== 2026-09-01T04:20:18Z  hang confirmed: backlog=12, json age 1min, MySQL probe failed
status=running started=2026-08-31T16:46:08.069310137Z restarts=0 oom=false
dionaea cpu=99.13% mem=103.4MiB / 3GiB pids=8
--- threads: tid state utime stime wchan
946791 R 86926 11496 wchan=0
946881 S 858 105 wchan=futex_wait_queue

7. 9. — gdb backtrace hlavního vlákna (dionaea-hang-20260907T174356Z.txt):

#0  0x00007fd8121fa6c1 in PyObject_GetAttr () from target:/usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0
#1  0x00007fd81216d2e4 in _PyEval_EvalFrameDefault () from target:/usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0

7. 9. — nasazená oprava:

            if h.messageLength < 16:
                break
            if len(data) - offset < h.messageLength:
                break

7. 9. — ověření opravy (~20:08Z):

=== CPU po: 1.77%
--- zije dionaea? MySQL pozdrav na 3306:
  ODPOVEDEL: b'5.7.16\x00\x00\x00\x12gaaaa'
--- SMB na 445:
  spojeni OK

9. Souvislosti

Související incidenty

  • 2026-09-07-srv3-deliberate-dionaea-freeze-repro — reprodukce této vady, při které agent dionaeu vědomě zamrzl na 47 s; jediný přímý důkaz mechanismu.
  • 2026-08-22-srv3-webtrap-https-tls-accept-hang — nalezeno při téže kontrole č. 2 a ze stejného důvodu (watchdog soudil živost podle stavu kontejneru). Oba incidenty vedly k přepsání watchdogu na liveness sondy.
  • 2026-08-22-srv3-pcap-ring-buffer-snaplen — pcap je jediná záloha pro okna zamrznutí; pro okno 24. 8. ale jen se snaplenem 256 B.

Co s incidentem nesouvisí

  • Restart dionaey 22. 8. 22:49Z při změně deny listu streamdumperu — zamrznutí mu podle záznamu nepředcházelo.
  • Distribuovaný sken portu 5901 (31. 8. – 1. 9.) — mířil na sink, ne na dionaeu.
  • Shluk 49 chyb accepting connection failed 31. 8. v 07:26 — nekryje se s žádným restartem.
  • /etc/cron.hourly/free (drop_caches) — z přípravy serveru, bez vazby na dionaeu.
  • Pokles denních počtů událostí dionaey začátkem září — změna provozu útočníků, ne následek zamrznutí.

10. Poučení

  • Jednovláknový honeypot má poloměr poškození rovný celé své ploše. Chyba v jednom protokolu položila všech čtrnáct portů.
  • docker ps není kontrola živosti. Zamrzlý proces hlásil Up, restarts=0, oom=false a držel porty otevřené, protože handshake dokončuje jádro.
  • Vypnutí podezřelé komponenty není ověření hypotézy. Vypnutí SIP stálo trvalou ztrátu SIP dialogů a problém neodstranilo. Teprve důkaz sebraný v okamžiku poruchy vedl k příčině.
  • Restart, který poruchu odstraní, zároveň zničí jediný důkaz. Sběr stavu procesu před restartem měl být součástí watchdogu od druhého výskytu, ne od desátého.
  • Práh detekce a throttle určují velikost ztráty. Práh 20 min znamenal minimálně 20 min díry na epizodu; throttle 30 min dvakrát nechal senzor slepý, přestože watchdog poruchu viděl.
  • Opakování je samostatný signál. Počítadlo restartů za 24 hodin v heartbeatu by vzorec ukázalo o tři dny dřív.
  • Poslední zalogovaná událost neukazuje viníka. Zamrznutí se spouští na datech, která se nelogují, ne na spojení, které se loguje.
  • Upstreamový # ToDo je varování. Projít kritické parsery na vzorec „offset se posouvá o hodnotu z paketu bez kontroly" je levnější než dva týdny vyšetřování.
  • Oprava uvnitř kontejneru je křehká — přežije restart, ne znovuvytvoření kontejneru. Kopie na hostiteli a zápis v HANDOVER.md jsou nutné.