En potentiell kund försökte köra fjärrkod genom Gits inbyggda hookar.

En potentiell kund försökte köra fjärrkod genom Gits inbyggda hookar.

SToFU Systems · Incidentanalys · 20 oktober 2026

Innehåll

  1. Det började med en förfrågan om utveckling
  2. Nedladdning och granskning av filerna
  3. Hur Gits post-checkout-hook kunde köras
  4. Vad Git-hookens nedladdare gör
  5. Fanns en applikation gömd i arkivet?
  6. Vad nedladdningsservern returnerade
  7. Kunde detta ha varit ett legitimt hjälpprogram?
  8. Att granska ett obekant Git-kodarkiv
  9. Efter granskningen av arkivet
  10. Korrespondens och bevisfiler

Det började med en förfrågan om utveckling

Det första meddelandet kom via vår webbplats den 15 oktober 2026. Avsändaren ville ha hjälp att bygga en plattform för att upptäcka finansiella bedrägerier. Det föreslagna systemet skulle poängsätta transaktionsrisk och använda beteendeanalys, med blockkedjeverifiering och rapportering bland de övriga kraven.

Den 19 oktober fick vi nedladdningslänken. Det medföljande mejlet hänvisade oss till grenen conf för arkitekturen och grenen NDA för avtalet. Där upprepades begäran att granska och underteckna sekretessavtalet.

Please review the project materials and review and sign the NDA in the NDA branch.

Den som följde instruktionerna skulle gå från att packa upp arkivet till att byta gren i Git. Mejlet framställde båda åtgärderna som en del av att läsa dokumentationen. Det nämnde inget om att köra ett nedladdat program.

Mejlet med projektarkivet och instruktionerna att öppna NDA-grenen. Identifierande uppgifter är täckta med grå rektanglar.

Mejlet med projektarkivet och instruktionerna att öppna NDA-grenen. Identifierande uppgifter är täckta med grå rektanglar.

Nedladdning och granskning av filerna

Länken ledde till en vanlig fildelningssida på Dropbox. Vi laddade ned AI-Fraud-Detection_Blockchain.tar.gz till en isolerad granskningsmiljö och sparade originalarkivet som referens. Den specifika delningsadressen publiceras inte här.

Vi listade arkivets innehåll och läste de medföljande Git-objekten direkt. På så sätt kunde vi hämta dokumenten från alla tre grenarna utan att checka ut en gren eller köra den medföljande koden. I grenarnas träd hittade vi 15 Markdown-filer och ett Word-dokument.

Gren Filer Vad vi hittade
master 8 Markdown-filer En README, en projektöversikt, produktkrav och verksamhetens användningsfall. Andra dokument behandlade prestanda, säkerhet, testning och drift.
conf 7 Markdown-filer Vägledning för ett utvecklingsförslag, blockkedjearkitektur och integration, krav på smarta kontrakt, data- och API-design, en AI-baserad riskmotor samt leveransmilstolpar.
NDA 1 DOCX-fil Ett sekretessavtal med ett underskriftsfält och platshållare från en mall.

Den föreslagna produkten kombinerade transaktionsanalys, bedrägeriregler och maskininlärningsbaserade poäng med blockkedjeverifiering. Den föreslagna teknikstacken använde Node.js och TypeScript med Express, PostgreSQL, Python-bibliotek för maskininlärning samt Ethereum. Leveransdokumentet beskrev sex milstolpar över 24 veckor. Vi hittade planeringsdokument i de medföljande träden, men ingen applikationsimplementation, tränad modell eller källkod till smarta kontrakt att granska.

Vissa detaljer förtjänade en närmare titt. API-exemplen innehöll de bokstavliga strängarna <built-in function id> och <built-in function hash> i sökvägarna till ändpunkterna. Sekretessavtalet innehöll fortfarande platshållare från mallen. Dessa inkonsekvenser väckte frågor om hur omsorgsfullt materialet hade förberetts.

Den körbara filen .git/hooks/post-checkout var ett allvarligare fynd. Kommentarerna beskrev ett hjälpprogram för att uppdatera en webbläsare eller ett tillägg, vilket saknade tydlig koppling till granskningen av projektet. När vi läste skriptet såg vi instruktioner för att ladda ned ett externt program och starta det i bakgrunden. Mejlets begäran att byta gren kunde leda en granskare till den körningsvägen när personen försökte läsa sekretessavtalet.

Vi höll kodarkivet inaktivt och granskade hooken som text. Nedan följer relevanta arkivmetadata och skriptets beteende.

Hur Gits post-checkout-hook kunde köras

Filen AI-Fraud-Detection_Blockchain.tar.gz är 779,429 byte lång. Dess 100 TAR-poster omfattar 60 vanliga filer. En fullständig .git-katalog följde med dokumenten.

Hook-katalogen innehöll de vanliga .sample-filerna och en körbar fil med namnet post-checkout.

AI-Fraud-Detection_Blockchain/.git/hooks/post-checkout

Det finns inget .sample-suffix. Dess TAR-mode är 0777, vilket omfattar körbehörighet, och dess längd är 2,774 byte.

Git anropar post-checkout efter att ha uppdaterat arbetskatalogens träd genom åtgärder som checkout eller switch, förutsatt att miljön tillåter att hooken körs. Git-dokumentationen beskriver utlösningsvillkoret.

Varför den arkiverade .git-katalogen spelar roll

Ett vanligt git clone kopierar inte källkodarkivets lokala klienthookar, vilket Pro Git förklarar. Den här leveransen innehöll den befintliga .git-katalogen i ett arkiv, så den lokala hooken följde med.

Hookens sökväg, mode och storlek lästa direkt från den ursprungliga TAR-filen. Vi använde inte den mottagna katalogen som ett Git-kodarkiv.

Hookens sökväg, mode och storlek lästa direkt från den ursprungliga TAR-filen. Vi använde inte den mottagna katalogen som ett Git-kodarkiv.

Vi granskade behållaren och Git-objekten direkt, utan att köra checkout eller switch i det mottagna kodarkivet.

Vad Git-hookens nedladdare gör

Kommentarer i skalskriptet beskriver ett hjälpprogram för att uppdatera en webbläsare eller ett tillägg. Vi hittade inget krav på ett sådant hjälpprogram i projektdokumenten. Skriptet är vanlig, icke obfuskerad text.

Det oanvända storlekströskelvärdet

Skriptet sätter THRESHOLD till 100 och ber Git om en lista över ändrade filnamn. Det initierar TRIGGER till noll.

THRESHOLD=100
FILES=$(git diff --name-only "$OLD_HEAD" "$NEW_HEAD")
TRIGGER=0

Inuti slingan beräknar det SIZE. Det finns ingen jämförelse med THRESHOLD och ingen tilldelning som ändrar TRIGGER. Nedladdningsblocket körs när TRIGGER är noll.

if [ "$TRIGGER" -eq 0 ]; then

Längs den normala vägen genom skriptet är villkoret sant även när listan över ändrade filer är tom. Tröskelvärdet begränsar inte nedladdningen.

Ursprungliga radnummer har behållits. TRIGGER förblir noll. THRESHOLD deklareras men används aldrig i en jämförelse.

Ursprungliga radnummer har behållits. TRIGGER förblir noll. THRESHOLD deklareras men används aldrig i en jämförelse.

Separata nedladdningar för Linux, macOS och Windows

Värdet som returneras av uname -s avgör nedladdningssökvägen och det lokala filnamnet.

Identifierat system Serversökväg Lokalt filnamn
Linux /api/l run-command.sh
Darwin / macOS /api/m run-command.sh
MINGW, MSYS, CYGWIN, Windows_NT /api/w run-command.cmd
Okänt system /api/l run-command.sh

URL:erna delar en värd, här ersatt med <DOWNLOAD_DOMAIN>. Vi har sparat den omaskerade hooken privat. Förgreningarna täcker Linux, macOS och Windows, med Linux som reservval för ett okänt system. Vi testade inte körning på dessa system.

Nedladdning av filen och försök att köra den

Hooken sparar filen i ${TMPDIR:-/tmp} med curl, eller wget om curl inte är tillgängligt. Ingen signatur eller förväntad hash kontrolleras före de följande körinstruktionerna.

chmod +x "$CMD_FILE"
"$CMD_FILE" > /dev/null 2>&1 &

Det avslutande et-tecknet startar kommandot i bakgrunden. Både standardutmatning och standardfel går till /dev/null.

Efter körförsöket skriver hooken azuku till .git-checker i den tillfälliga katalogen. Den kontrollerar aldrig denna markör innan den laddar ned igen. Den väntar inte heller på att bakgrundsprocessen ska lyckas innan den skriver filen. Markören kan därför finnas efter ett misslyckat körförsök.

De ursprungliga instruktionerna för nedladdning, chmod, bakgrundskörning och skrivning av markören. Programmet i det andra steget finns inte i detta utdrag.

De ursprungliga instruktionerna för nedladdning, chmod, bakgrundskörning och skrivning av markören. Programmet i det andra steget finns inte i detta utdrag.

En kommentar nära slutet säger att den tillfälliga nedladdningskatalogen ska tas bort. Det finns inget borttagningskommando under den.

Fanns en applikation gömd i arkivet?

Nätverksnedladdningen väckte en annan fråga. Fanns det redan en applikation i arkivet, kanske i Git-historiken eller sekretessavtalet? Vi granskade behållarnas gränser, avkodade sedan varje medföljande Git-objekt och granskade DOCX-innehållet.

Arkivets gränser

Vi registrerade originalarkivets SHA-256 innan vi granskade innehållet.

6f44ff4e461828dd1fe6ede75ca8d9d4b579c2ac223463629e9a7537b9df5040

Dekomprimering av gzip som data gav en TAR-ström på 890,880 byte. Gzip-strömmen avslutades korrekt, utan oanvända byte efter den. De sista 5,120 byten efter den sista TAR-posten var nollutfyllnad.

Vi granskade sedan de filer och objekt som dessa behållarposter omfattade.

Sparade kontroller av gzip-strömmens slut och TAR-utfyllnad. Ingen kod från provet kördes.

Sparade kontroller av gzip-strömmens slut och TAR-utfyllnad. Ingen kod från provet kördes.

Att hitta hooken i TAR-huvudet

Huvudet för posten post-checkout börjar vid 0xCF600, eller 849,408, i den dekomprimerade TAR-filen. Fildatan börjar vid 849,920. Dessa positioner avser TAR-strömmen, inte den komprimerade .gz-filen.

Vid den positionen börjar huvudet med sökvägen till post-checkout.

TAR / hexadecimal visning

000cf600  41 49 2d 46 72 61 75 64 2d 44 65 74 65 63 74 69  |AI-Fraud-Detecti|
000cf610  6f 6e 5f 42 6c 6f 63 6b 63 68 61 69 6e 2f 2e 67  |on_Blockchain/.g|
000cf620  69 74 2f 68 6f 6f 6b 73 2f 70 6f 73 74 2d 63 68  |it/hooks/post-ch|
000cf630  65 63 6b 6f 75 74 00 00 00 00 00 00 00 00 00 00  |eckout..........|
000cf640  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
000cf650  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
000cf660  00 00 00 00 30 30 30 30 37 37 37 00 30 30 30 31  |....0000777.0001|
000cf670  37 35 30 00 30 30 30 31 37 35 30 00 30 30 30 30  |750.0001750.0000|
000cf680  30 30 30 35 33 32 36 00 31 35 32 35 32 30 30 34  |0005326.15252004|
000cf690  33 30 37 00 30 32 34 30 37 35 00 20 30 00 00 00  |307.024075. 0...|
000cf6a0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|

I ett TAR-huvud upptar mode byten [100:108] och size upptar [124:136]. De avkodade fälten för denna post följer efter dumpen.

TAR-fält Råa byte / värde
mode b'0000777\x00'
size b'00000005326\x00'
Oktalt mode 0777
Decimal storlek 2774 byte
Lagrad / beräknad kontrollsumma 10301 / 10301

Den oktala storleken avkodas till 2,774 byte. Den lagrade kontrollsumman i huvudet är 10,301. En omberäkning med kontrollsummefältet fyllt med blanksteg ger samma resultat.

Hookens råa TAR-huvud och avkodade fält. Namn, behörigheter och storlek syns i behållarens byte.

Hookens råa TAR-huvud och avkodade fält. Namn, behörigheter och storlek syns i behållarens byte.

Vi beräknade även hashen för hooken som extraherades från denna post.

854b3b88b06fad9d9ffec36b35be0133b1d502084d4d7cce232eda2b2dd03092

Dumpen av TAR-posten och den anonymiserade hooken följer med artikeln. Hashen ovan identifierar det omaskerade original som förvaras privat, inte den maskerade publiceringskopian.

Att läsa Git-objekt utan checkout

Det finns 24 lösa objekt i .git/objects, vart och ett lagrat i en zlib-ström. De dekomprimerade uppgifterna innehåller ett Git-huvud följt av objektets kropp.

<type> <size>\0<body>

Vi kontrollerade den deklarerade kroppslängden och beräknade SHA-1 över hela den avkodade sekvensen, inklusive huvudet och NUL-byten. Resultatet måste stämma med objekt-ID:t i filnamnet. Detta kontrollerar objektets integritet. Det säger inget om vem som skapade det.

För varje objekt jämförde vi den deklarerade längden med kroppens längd och verifierade hashen över all avkodad data.

expanded = zlib.decompress(compressed_object)
header, body = expanded.split(b"\0", 1)
kind, declared_size = header.decode("ascii").split()

assert len(body) == int(declared_size)
assert hashlib.sha1(expanded).hexdigest() == object_id

Vi kontrollerade även zlib-strömmarnas slut. Objekten utgörs av 16 blobbar, 5 träd och 3 committar. Genom att följa de tre grenarnas spetsar, deras överordnade committar och underordnade träd kunde vi redovisa alla 24 objekt. Det finns inga onåbara blobbar bland de medföljande objekten.

Git / relationer mellan commits

master 4bc26f6c18910ca777c8238d2f88f6e725fcdc3f
  tree   feb0feaf7b8e826b085e90dea5399772d7b91f02
  parent (none)

conf   239b9aa2edc8c5e21fddeea5ed0e937496ae013f
  tree   048b51f9673f94354251ce16a78e663c71667a4c
  parent 4bc26f6c18910ca777c8238d2f88f6e725fcdc3f

NDA    a1311875d86bf6f1a6b9f2fee6527abbd1ce647d
  tree   cc020d922090835ea4ac3a3e418d0213d7a2ad94
  parent 239b9aa2edc8c5e21fddeea5ed0e937496ae013f

Den fullständiga objektförteckningen omfattar även objekten utanför det aktuella arbetskatalogträdet.

Förteckning över alla 24 Git-objekt

Objekt-ID Typ Kropp, byte
08e2cda2f440c1792c7c35a3499bfd1ade3e9bad blob 6497
22bb86aacf377c17c7ad0d52c5cefeeb93dfa13e blob 5123
2a7091bdd006a2f98a8c795fd7d2a04c8ee53056 blob 2610
39e13459086f36bc7c933d4e7b5d249a22db24bd blob 3061
3f50e45c67dee5aac77147a5418afe551e8871be blob 2433
476dc872c6def747dcdac549b67a8dc80948b7e1 blob 3191
5a51550933b593eb65da458bbdd579f85c082dab blob 752100
5e53fd0880963e1767ad23fb8612b76e31f04003 blob 2807
60a7cbff83445488fd34b12de1814dc56c956963 blob 2054
74d479352822f5cc1d03552f517cfb5b2d7aa6d3 blob 2281
84e694473554c8a7c01f038a1b6ef8d9355405f7 blob 2033
bb7b5d8bc28c4a6257f7d87a685c61ba16a3789c blob 2425
d83c8e0c416766be34276013944f5b94726e8c8f blob 2776
dfd0f171bca257780eb0d9e22ba2eda1db9d4b68 blob 8402
e3b57e48010fc25fd12e7f5f25e952aca843e537 blob 6316
ed325750862eb6cdc92b216258a00a784312d793 blob 3062
239b9aa2edc8c5e21fddeea5ed0e937496ae013f commit 213
4bc26f6c18910ca777c8238d2f88f6e725fcdc3f commit 165
a1311875d86bf6f1a6b9f2fee6527abbd1ce647d commit 212
048b51f9673f94354251ce16a78e663c71667a4c tree 438
2cb70db8d9317603cb5f0fee0029b66581a7162e tree 104
61874365e5498a30c8b61ef63bbb1d28b4cf4e22 tree 320
cc020d922090835ea4ac3a3e418d0213d7a2ad94 tree 57
feb0feaf7b8e826b085e90dea5399772d7b91f02 tree 104

Längd och SHA-1 verifierades mot varje objekts ursprungliga Git-kodning. Alla 24 kontroller godkändes.


Att följa sekretessavtalet från dess träd till dess byte

Grenen NDA pekar på ett träd som innehåller en fil, Non-Disclosure-Agreement.docx. En post i ett Git-träd lagrar mode och filnamn som text, följt av en NUL och 20 råa byte för blob-ID:t. Vi parsade posten direkt ur trädets kropp.

Git-träd / hexadecimal visning

00000000  31 30 30 36 34 34 20 4e 6f 6e 2d 44 69 73 63 6c  |100644 Non-Discl|
00000010  6f 73 75 72 65 2d 41 67 72 65 65 6d 65 6e 74 2e  |osure-Agreement.|
00000020  64 6f 63 78 00 5a 51 55 09 33 b5 93 eb 65 da 45  |docx.ZQU.3...e.E|
00000030  8b bd d5 79 f8 5c 08 2d ab                       |...y.\.-.|

Råa byte från NDA-trädet och den avkodade referensen till dess DOCX-blobb.

Råa byte från NDA-trädet och den avkodade referensen till dess DOCX-blobb.

Den posten hänvisar till följande blobb.

5a51550933b593eb65da458bbdd579f85c082dab

Efter zlib-dekomprimering börjar objektet med blob 752100\0. Direkt efter huvudet kommer byten 50 4b 03 04, en ZIP-behållares PK-signatur.

Git-blob / efter zlib-dekomprimering

00000000  62 6c 6f 62 20 37 35 32 31 30 30 00 50 4b 03 04  |blob 752100.PK..|
00000010  0a 00 00 00 00 00 87 4e e2 40 00 00 00 00 00 00  |.......N.@......|
00000020  00 00 00 00 00 00 09 00 00 00 64 6f 63 50 72 6f  |..........docPro|
00000030  70 73 2f 50 4b 03 04 14 00 00 00 08 00 87 4e e2  |ps/PK.........N.|
00000040  40 a5 76 12 16 69 01 00 00 7b 02 00 00 10 00 00  |@.v..i...{......|
00000050  00 64 6f 63 50 72 6f 70 73 2f 61 70 70 2e 78 6d  |.docProps/app.xm|
00000060  6c 9d 92 c1 4e c3 30 10 44 ef 48 fc 43 94 7b 62  |l...N.0.D.H.C.{b|

Komprimerade objektbyte, det avkodade Git-huvudet och början av DOCX-filen. Längd och objekt-ID kontrollerades mot det fullständiga objektet.

Komprimerade objektbyte, det avkodade Git-huvudet och början av DOCX-filen. Längd och objekt-ID kontrollerades mot det fullständiga objektet.

Kroppen är 752,100 byte lång. Dess SHA-256 stämmer med den DOCX-fil vi sparade separat för analys.

9d85170d2c0aa7a9b90dfc3855715a31d971bba7abb563e9efa1153fdc15634f

Dessa objekt redovisar vägen från grenen NDA till dokumentets byte.

Redovisning av alla 16 blobbar

Femton blobbar avkodas som projektdokument i UTF-8-kodad Markdown. Den återstående blobben är DOCX-filen ovan. Ingen börjar med ett PE-, ELF- eller Mach-O-huvud.

Sökväg i träden Storlek, byte Typ / första byte
04-solution-proposal-guidance.md 2054 UTF-8-text · 23 20 44 65 76 65 6c 6f 70 6d 65 6e 74 20 43 6f
06-blockchain-architecture.md 6497 UTF-8-text · 23 20 42 6c 6f 63 6b 63 68 61 69 6e 20 41 72 63
07-blockchain-integration-specification.md 2807 UTF-8-text · 23 20 42 6c 6f 63 6b 63 68 61 69 6e 20 49 6e 74
08-smart-contract-specification.md 2610 UTF-8-text · 23 20 53 6d 61 72 74 20 43 6f 6e 74 72 61 63 74
09-data-and-api-architecture.md 2776 UTF-8-text · 23 20 44 61 74 61 20 26 20 41 50 49 20 41 72 63
11-ai-fraud-and-risk-engine.md 3062 UTF-8-text · 23 20 41 49 20 46 72 61 75 64 20 44 65 74 65 63
14-deliverables-acceptance-and-milestones.md 6316 UTF-8-text · 23 20 44 65 6c 69 76 65 72 61 62 6c 65 73 2c 20
Detailed/03-business-and-use-cases.md 3061 UTF-8-text · 23 20 42 75 73 69 6e 65 73 73 20 52 65 71 75 69
Detailed/05-non-functional-requirements.md 2033 UTF-8-text · 23 20 4e 6f 6e 2d 46 75 6e 63 74 69 6f 6e 61 6c
Detailed/10-security-and-privacy-requirements.md 2433 UTF-8-text · 23 20 53 65 63 75 72 69 74 79 20 26 20 50 72 69
Detailed/12-testing-and-quality-requirements.md 2425 UTF-8-text · 23 20 54 65 73 74 69 6e 67 20 26 20 51 75 61 6c
Detailed/13-deployment-monitoring-and-operations.md 2281 UTF-8-text · 23 20 44 65 70 6c 6f 79 6d 65 6e 74 2c 20 4d 6f
Intro/01-project-overview.md 8402 UTF-8-text · 23 20 50 72 6f 6a 65 63 74 20 4f 76 65 72 76 69
Intro/02-product-requirements.md 3191 UTF-8-text · 23 20 50 72 6f 64 75 63 74 20 52 65 71 75 69 72
Non-Disclosure-Agreement.docx 752100 DOCX/ZIP · 50 4b 03 04 0a 00 00 00 00 00 87 4e e2 40 00 00
README.md 5123 UTF-8-text · 23 20 41 49 20 46 72 61 75 64 20 44 65 74 65 63

Alla 16 medföljande blobbar har klassificerats. Träden innehåller projektdokument; ingen produktimplementation hittades.

Alla 16 medföljande blobbar har klassificerats. Träden innehåller projektdokument; ingen produktimplementation hittades.

Vi läste textinnehållet och kontrollerade även signaturerna. DOCX-filen var den enda blobben som inte var text och behövde en separat granskning av behållaren.

Att öppna DOCX som ZIP

Dokumentet innehåller 25 ZIP-poster, fördelade på 17 fildelar och 8 kataloger. Vi läste varje fildel och kontrollerade dess CRC.

DOCX-del Storlek, byte CRC32
[Content_Types].xml 1482 ec936159
_rels/.rels 737 1f222201
customXml/_rels/item1.xml.rels 296 7a393f74
customXml/item1.xml 400 4ed0e3fe
customXml/itemProps1.xml 327 457b4363
docProps/app.xml 635 161276a5
docProps/core.xml 595 d5626da7
docProps/custom.xml 722 8d44908d
word/_rels/document.xml.rels 1086 22475620
word/_rels/settings.xml.rels 398 e5802c0c
word/document.xml 91835 4df71596
word/fontTable.xml 4234 2796cccd
word/media/image1.png 712863 09063019
word/media/image2.png 10193 3aea21cf
word/settings.xml 4116 34faa9ef
word/styles.xml 30020 b4e9edbd
word/theme/theme1.xml 6329 ed5975e1

DOCX-delarnas namn, längder och CRC32-värden. Vi granskade ZIP- och XML-data utan att öppna dokumentet i Office.

DOCX-delarnas namn, längder och CRC32-värden. Vi granskade ZIP- och XML-data utan att öppna dokumentet i Office.

Det finns ingen vbaProject.bin eller OLE-bilaga i listan över delar. Två PNG-filer innehåller en logotyp och en bild av en underskrift. Vi granskade även XML-relationerna och hittade en referens till en lokal Office-mallsökväg på dokumentförfattarens dator. Vi slog inte upp den och läste inte in den.

Underskriftsbilden och Gits författarfält ger oss inget tillförlitligt sätt att identifiera avsändaren. Båda kan kopieras eller ersättas.

Vi hittade ingen separat applikation eller produktimplementation i det medföljande innehållet. Hooken hämtar sitt nästa program via nätverket. Vår granskning av behållarna utesluter inte alla tänkbara exploateringsmetoder eller steganografiska tekniker.

Vad nedladdningsservern returnerade

Vi hämtade de tre exakta URL:erna som data, utan att köra svaren eller följa omdirigeringar. Den 19 oktober, mellan 17:29:27 och 17:29:28 UTC, returnerade var och en HTTP 200. Alla tre svarskropparna innehöll samma meddelande på 21 byte.

Permanently suspended

De tre sparade observationerna av ändpunkterna. Vi gjorde inga ytterligare anrop till nedladdarens URL:er när vi förberedde artikeln.

De tre sparade observationerna av ändpunkterna. Vi gjorde inga ytterligare anrop till nedladdarens URL:er när vi förberedde artikeln.

Vi har inga byte från det andra steget att analysera genom omvänd konstruktion. Vi vet inte heller vad ändpunkterna returnerade tidigare, till en annan besökare eller under andra anropsförhållanden. Avstängningsmeddelandet ger oss ingen verifierad förklaring till varför tjänsten stängdes av.

Hooken försöker ladda ned och köra en extern fil. Påståenden om stulna lösenord, token, källkod eller plånböcker skulle kräva bevis som vi inte har.

Kunde detta ha varit ett legitimt hjälpprogram?

Ett internt uppdateringsprogram kan av misstag hamna i ett arkiv. Git-hookar, bakgrundsprocesser och curl har alla legitima användningsområden.

I det här materialet bad mejlet oss uttryckligen att gå till en annan gren. Det kunde anropa den medföljande nedladdaren, trots att det angivna skälet till grenbytet var att läsa ett avtal. Mejlet nämnde inte körningen. Vi hittade inte heller någon koppling mellan en webbläsaruppdaterare och det föreslagna systemet, och skriptets storlekskontroll var ofullständig.

Vi behandlade materialet som ett försök till attack genom leverans av kod och förhindrade att hooken kördes. För att ompröva den bedömningen skulle vi behöva källkoden till de nedladdade filerna och en verifierbar förklaring till varför en uppdragstagare behövde köra dem för att granska sekretessavtalet.

Vi har inte fastställt operatörens identitet. Avsändaradressen, commit-metadata och namnen i dokumentet räcker inte för attribuering.

Analysdiagram över körningsstegen som beskrivs av den medföljande hooken.

Analysdiagram över körningsstegen som beskrivs av den medföljande hooken.

Att granska ett obekant Git-kodarkiv

En utvecklare som följde mejlet kunde nå körningsutlösaren medan personen fortfarande läste om projektet. Det fanns inget behov av att bygga eller starta den föreslagna applikationen.

Om du granskar kundmaterial på en dator med SSH-nycklar för produktion eller molntoken kan ett oväntat skript få tillgång till dessa resurser. En engångsmiljö måste hålla dessa autentiseringsuppgifter utom räckhåll. Webbläsarsessioner på granskningsdatorn förtjänar samma hänsyn.

Granskningen bör omfatta den medföljande .git-katalogen och all IDE-automatisering innan en utvecklare börjar använda sina vanliga kommandon. Installationsskript behöver också granskas. I värddatorns loggar skulle vi leta efter Git eller ett skal som laddar ned en fil till en tillfällig katalog och sedan kör den. En curl-process i sig säger oss betydligt mindre.

Om originalmejlet och arkivet bevaras kan en senare granskare kontrollera vad som levererades. Hashar och händelser på värddatorn hjälper till att fastställa vad som hände på datorn. En saknad markör kan inte fastställa att ett program aldrig kördes.

Kan nedladdning eller uppackning av arkivet köra denna hook?

Nedladdning och vanlig uppackning anropar inte i sig Gits post-checkout-hook. I det här provet är den dokumenterade utlösaren att Git uppdaterar arbetskatalogens träd genom checkout eller switch, när hookkörning tillåts. Vi granskade de medföljande objekten direkt utan att anropa dessa åtgärder.

Efter granskningen av arkivet

Vi hade väntat oss att nästa utbyte skulle handla om arkitektur och leveransdatum. I stället skickade vi ett svar om hooken och bevarade materialet för vidare granskning. Vi kan fortfarande inte säga vad fjärrprogrammet gjorde eller vem som drev det. Hooken gav oss tillräckliga skäl att stoppa det begärda Git-arbetsflödet.

I mer än fem år har SToFU Systems och våra lösningar hjälpt företag att skydda sina system, även mot attacker som levereras genom affärskorrespondens och utvecklingsmaterial. Våra säkerhetsgranskningar undersöker hur kod och åtkomst kan missbrukas. Vi erbjuder också omvänd konstruktion när ett team behöver förstå obekant programvara.

Om ett kodarkiv eller en binärfil väcker frågor, prata med vårt team om en teknisk granskning innan materialet förs in i din vanliga utvecklingsmiljö.

Korrespondens och bevisfiler

De fyra meddelandena nedan använder platshållare för personnamn, adresser, tredje parters identiteter och identifierande länkar. Övrig ordalydelse i de nya meddelandena har behållits. Upprepade citat har utelämnats eftersom varje mejl visas separat. Webbformulärets tjänste-IP och orelaterade mottagares adresser har också utelämnats.

1. Den första förfrågan via vår webbplats

E-post / identifierande uppgifter ersatta

Date: Thu, 15 Oct 2026 12:55:21 +0000
From: SToFU Site Form <TEAM_EMAIL>
To: <TEAM_EMAIL>
Subject: SToFU Systems - Contact by <SENDER_NAME> <SENDER_EMAIL>
Reply-To: <SENDER_NAME> <SENDER_EMAIL>

Time: 2026-10-15T12:55:21+00:00
IP: [redacted]
Page: /contact
Name: <SENDER_NAME>
Email: <SENDER_EMAIL>
Attachments: none
Message:
We are currently developing an AI-powered FinTech fraud detection platform designed to help financial organizations identify suspicious transactions, assess potential risks in real time, and strengthen their fraud prevention and investigation processes.
The planned platform will incorporate AI/ML-based fraud detection, transaction risk scoring, behavioral analysis, configurable fraud-detection rules, blockchain-based verification, automated alerts, investigation support, and reporting and analytics.
We are looking to connect with an experienced technology partner with expertise in blockchain, financial technology, AI/ML, and scalable web platform development to help us bring this product to life.
We would welcome the opportunity to discuss your team’s capabilities, experience, and potential role in the project. The specific scope of your team’s involvement, technical responsibilities, and collaboration model can be determined through our discussion, based on your expertise and recommendations.
If this opportunity aligns with your team’s capabilities and interests, I’d be happy to share the project overview and technical roadmap for an initial review.
---

Den första förfrågan via vår webbplats. Anonymiserad publiceringsvy av det bevarade mejlet.

Den första förfrågan via vår webbplats. Anonymiserad publiceringsvy av det bevarade mejlet.

SHA-256 för privat, omaskerad EML: bf7d0f3a59b84f509ca436e0750640e844e9731ce363a42a99d5be60cdf8597e


2. Vårt svar med begäran om materialet

E-post / identifierande uppgifter ersatta

Date: Sat, 17 Oct 2026 19:46:28 -0000
From: <TEAM_MEMBER_NAME> <TEAM_EMAIL>
To: <SENDER_NAME> <SENDER_EMAIL>
Subject: Re: Your AI fraud detection platform
Cc: [redacted: third-party addresses]

Hi <SENDER_NAME>,

Thank you for getting in touch through our website. I'm <TEAM_MEMBER_NAME>, <TEAM_MEMBER_ROLE> of SToFU Systems (<COMPANY_WEBSITE>). You can find me on <PROFESSIONAL_NETWORK> here:
<PROFILE_URL>

Your fraud detection platform sounds like a great project. Helping financial teams spot suspicious transactions and investigate them more effectively is a worthwhile problem to solve, and we'd be very happy to help you bring it to life.

We'd be glad to help with the architecture, development, security, and ongoing maintenance. We'll do everything we can to get the platform launched and keep it running reliably as it grows.

If you plan to seek investment, we can also help prepare the technical side for those conversations, including a working product or demo, clear architecture and documentation, and a practical development roadmap.

Please send over the project overview and technical roadmap you mentioned. It would be helpful to understand what you've already built and what you'd like to tackle first.

I'd be happy to arrange a call to discuss the project and how we could work together. What day and time would suit you? Please include your time zone so we can find a slot that works for both teams.

Thank you again for reaching out, and have a great day!

Best regards,
<TEAM_MEMBER_NAME>
<TEAM_MEMBER_ROLE>
SToFU Systems
<COMPANY_WEBSITE>

Vårt svar med begäran om materialet. Anonymiserad publiceringsvy av det bevarade mejlet.

Vårt svar med begäran om materialet. Anonymiserad publiceringsvy av det bevarade mejlet.

SHA-256 för privat, omaskerad EML: 1e5330dd82e02911254722744a3202e9b761c8c1d2950be937cd5d539c1bcad9


3. Arkivmejlet som anger grenarna NDA / conf

E-post / identifierande uppgifter ersatta

Date: Mon, 19 Oct 2026 09:03:41 +0000
From: <SENDER_EMAIL>
To: <TEAM_EMAIL>
Subject: Re: Your AI fraud detection platform

Hi <TEAM_MEMBER_NAME>,
Thank you for your interest in our AI-powered FinTech fraud detection platform.
I’ve also reviewed your <PROFESSIONAL_NETWORK> profile, and I’m confident that you and your team can make a valuable contribution to our project.
I’m happy to share the project materials for your review.
We’ve prepared the project overview, technical roadmap, and NDA, which provide the key information needed to understand the project, its objectives, and the proposed technical direction.
The platform focuses on AI-driven fraud detection, transaction risk assessment, behavioral analysis, fraud prevention, blockchain-based verification, automated alerts, investigation support, and financial risk analytics.
This is the Link:
<FILE_SHARE_URL>
Please review the project materials and review and sign the NDA in the NDA branch.
The NDA is required because the project materials contain confidential business, technical, architectural, and product information.
So, please send me the signed NDA as soon as possible.
In particular, we would appreciate your initial technical assessment of the proposed system architecture and timeline. The detailed documentation and specifications related to these areas are available in the conf branch.
After your review, we would like to arrange a meeting to discuss your technical observations, recommendations, questions, development approach, and potential partnership opportunities in more detail.
Once you have completed your review, please let me know your preferred meeting date and time and provide the signed NDA.
Please feel free to take the time you need to review the materials thoroughly. I look forward to receiving your feedback and speaking with you about the project.
Kind regards,
<SENDER_NAME>

Arkivmejlet som anger grenarna NDA / conf. Anonymiserad publiceringsvy av det bevarade mejlet.

Arkivmejlet som anger grenarna NDA / conf. Anonymiserad publiceringsvy av det bevarade mejlet.

SHA-256 för privat, omaskerad EML: f7007ed3053d3ba2ef71ea01c74ec0c4aebfd48417f757ecec8d9d7d5884bf33


4. Vårt svar efter att vi upptäckt hooken

E-post / identifierande uppgifter ersatta

Date: Mon, 19 Oct 2026 19:37:58 +0200
From: SToFU Systems <TEAM_EMAIL>
To: <SENDER_NAME> <SENDER_EMAIL>
Subject: Re: Your AI fraud detection platform

Hi <SENDER_NAME>,

We reviewed the materials you sent. Unfortunately, we found no application source code or working implementation, only planning documents and an NDA.

Execution of the supplied Git post-checkout hook was disabled during our review. The hook downloads and runs platform-specific files from <DOWNLOAD_DOMAIN>, hides their output, and writes a local marker. Our security policies do not allow the execution of untrusted third-party hooks.

Thank you for your time and for the elaborate attempt to deliver malicious code.

We have traced the technical delivery chain and preserved the archive, hook, download responses, correspondence, and author names and email addresses recorded in the repository. The relevant evidence will be passed to the competent law enforcement authorities in the applicable jurisdictions.

SToFU Systems

Vårt svar efter att vi upptäckt hooken. Anonymiserad publiceringsvy av det bevarade mejlet.

Vårt svar efter att vi upptäckt hooken. Anonymiserad publiceringsvy av det bevarade mejlet.

SHA-256 för privat, omaskerad EML: 31df91adb2eb52be2171836d3e26610328a0a1a1273dbf7d56efe4354bb62e19


Anonymiserad vy av hela hooken

Alla 101 radnummer i källan har behållits. Identifierande uppgifter är täckta med grå rektanglar.

Alla 101 radnummer i källan har behållits. Identifierande uppgifter är täckta med grå rektanglar.


Omaskerade original förvaras privat. Offentliga bevisfiler använder platshållare och skärmbilder använder ogenomskinliga grå rektanglar. Hashar märkta som original identifierar den privata källan, inte en redigerad publiceringskopia. Figurerna är skärmbilder av lokala bevisvyer där identifierande text togs bort före rendering. Ingen mottagen kod kördes.

SToFU Systems

SToFU Systems

Tillbaka till bloggar

Kontakta

Starta konversationen

Några tydliga rader räcker. Beskriv systemet, pressen och beslutet som har fastnat. Eller skriv direkt till midgard@stofu.io.

0 / 10000
Ingen fil har valts