Potentiaalinen asiakas yritti suorittaa etäkoodia Gitin sisäänrakennettujen koukkujen kautta.

Potentiaalinen asiakas yritti suorittaa etäkoodia Gitin sisäänrakennettujen koukkujen kautta.

SToFU Systems · Tietoturvapoikkeaman tutkimus · 20. lokakuuta 2026

Sisällys

  1. Kaikki alkoi ohjelmistokehitystä koskevasta tiedustelusta
  2. Tiedostojen lataaminen ja tarkastaminen
  3. Miten Gitin post-checkout-koukku voisi käynnistyä
  4. Mitä Git-koukun latausohjelma tekee
  5. Oliko arkiston sisään piilotettu sovellus?
  6. Mitä latauspalvelin palautti
  7. Olisiko tämä voinut olla laillinen apuohjelma?
  8. Tuntemattoman Git-tietovaraston tarkastaminen
  9. Arkiston tarkastamisen jälkeen
  10. Kirjeenvaihto ja todistusaineistotiedostot

Kaikki alkoi ohjelmistokehitystä koskevasta tiedustelusta

Ensimmäinen viesti saapui verkkosivustomme kautta 15. lokakuuta 2026. Lähettäjä halusi apua talouspetosten havaitsemiseen tarkoitetun alustan rakentamiseen. Ehdotettu järjestelmä pisteyttäisi tapahtumien riskiä ja käyttäisi käyttäytymisanalyysia. Muita vaatimuksia olivat muun muassa lohkoketjuvarmennus ja raportointi.

Saimme latauslinkin 19. lokakuuta. Mukana tulleessa sähköpostissa meitä ohjattiin conf-haaraan arkkitehtuurin ja NDA-haaraan sopimuksen lukemista varten. Viestissä pyydettiin uudelleen tarkastamaan ja allekirjoittamaan salassapitosopimus.

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

Näitä ohjeita noudattava tarkastaja etenisi arkiston purkamisesta haarojen vaihtamiseen Gitissä. Sähköpostissa molemmat toimenpiteet esitettiin osana dokumentaation lukemista. Ladatun ohjelman suorittamisesta ei mainittu mitään.

Sähköposti, jossa toimitettiin projektiarkisto ja ohjeet NDA-haaran avaamiseen. Tunnistetiedot on peitetty harmailla suorakulmioilla.

Sähköposti, jossa toimitettiin projektiarkisto ja ohjeet NDA-haaran avaamiseen. Tunnistetiedot on peitetty harmailla suorakulmioilla.

Tiedostojen lataaminen ja tarkastaminen

Linkki johti tavalliselle Dropboxin tiedostonjakosivulle. Latasimme tiedoston AI-Fraud-Detection_Blockchain.tar.gz eristettyyn tarkastusympäristöön ja säilytimme alkuperäisen arkiston vertailua varten. Tarkkaa jakolinkin URL-osoitetta ei julkaista tässä.

Listasimme arkiston sisällön ja luimme toimitetut Git-objektit suoraan. Näin saimme talteen kaikkien kolmen haaran asiakirjat ottamatta haaraa käyttöön tai suorittamatta toimitettua koodia. Haarojen puista löytyi yhteensä 15 Markdown-tiedostoa ja yksi Word-asiakirja.

Haara Tiedostot Mitä löysimme
master 8 Markdown-tiedostoa README, projektin yleiskuvaus, tuotevaatimukset ja liiketoiminnan käyttötapaukset. Muut asiakirjat käsittelivät suorituskykyä, tietoturvaa, testausta ja operointia.
conf 7 Markdown-tiedostoa Ohjeita kehitysehdotuksen laatimiseen, lohkoketjuarkkitehtuuri ja -integraatio, älysopimusvaatimukset, tieto- ja API-suunnittelu, tekoälypohjainen riskimoottori sekä toimituksen välitavoitteet.
NDA 1 DOCX-tiedosto Salassapitosopimus, jossa oli allekirjoitusosio ja asiakirjapohjan paikkamerkkejä.

Ehdotettu tuote yhdisti tapahtuma-analyysin, petossäännöt ja koneoppimisen tuottamat pisteet lohkoketjuvarmennukseen. Ehdotettuun teknologiapinoon kuuluivat Node.js ja TypeScript sekä Express, PostgreSQL, Pythonin koneoppimiskirjastot ja Ethereum. Toimitusasiakirjassa määriteltiin kuusi välitavoitetta 24 viikon ajalle. Kaikkialta toimitetuista puista löytyi suunnitteluasiakirjoja, mutta tarkastettavaksi ei löytynyt sovellustoteutusta, koulutettua mallia eikä älysopimuksen lähdekoodia.

Jotkin yksityiskohdat ansaitsivat tarkemman tarkastelun. API-esimerkkien päätepistepoluissa oli kirjaimelliset merkkijonot <built-in function id> ja <built-in function hash>. Salassapitosopimuksessa oli edelleen asiakirjapohjan paikkamerkkejä. Nämä epäjohdonmukaisuudet herättivät kysymyksiä siitä, miten huolellisesti aineisto oli valmisteltu.

Suoritettava .git/hooks/post-checkout-tiedosto oli vakavampi löydös. Sen kommenteissa kuvailtiin selaimen tai laajennuksen päivitysapuria, jolla ei näyttänyt olevan yhteyttä tämän projektin tarkastamiseen. Skriptin lukeminen paljasti ohjeet ulkoisen ohjelman lataamiseen ja käynnistämiseen taustalle. Sähköpostin pyyntö vaihtaa haaraa saattoi johdattaa tarkastajan tähän suorituspolkuun hänen yrittäessään lukea salassapitosopimusta.

Pidimme tietovaraston passiivisena ja tarkastelimme koukkua tekstinä. Arkiston olennaiset metatiedot ja skriptin toiminta esitetään jäljempänä.

Miten Gitin post-checkout-koukku voisi käynnistyä

Tiedoston AI-Fraud-Detection_Blockchain.tar.gz pituus on 779,429 tavua. Sen 100 TAR-merkintää sisältävät 60 tavallista tiedostoa. Asiakirjojen mukana toimitettiin kokonainen .git-hakemisto.

Koukkuhakemistossa olivat tavalliset .sample-tiedostot sekä suoritettava tiedosto nimeltä post-checkout.

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

Nimessä ei ole .sample-päätettä. Sen TAR-oikeustila on 0777, joka sisältää suoritusoikeudet, ja sen pituus on 2,774 tavua.

Git kutsuu post-checkout-koukkua päivitettyään työpuun esimerkiksi checkout- tai switch-toiminnolla, jos ympäristö sallii koukun suorittamisen. Laukaisuehto kuvataan Gitin dokumentaatiossa.

Miksi arkistoitu .git-hakemisto on merkityksellinen

Tavallinen git clone ei kopioi lähdetietovaraston paikallisia asiakaspuolen koukkuja, kuten Pro Git selittää. Tämä toimitus sisälsi olemassa olevan .git-hakemiston arkiston sisällä, joten paikallinen koukku tuli sen mukana.

Koukun polku, oikeustila ja koko luettuina suoraan alkuperäisestä TAR-arkistosta. Emme käyttäneet vastaanotettua hakemistoa Git-tietovarastona.

Koukun polku, oikeustila ja koko luettuina suoraan alkuperäisestä TAR-arkistosta. Emme käyttäneet vastaanotettua hakemistoa Git-tietovarastona.

Tarkastelimme säiliötä ja Git-objekteja suoraan suorittamatta checkout- tai switch-toimintoa vastaanotetussa tietovarastossa.

Mitä Git-koukun latausohjelma tekee

Komentotulkkiskriptin kommenteissa kuvataan selaimen tai laajennuksen päivitysapuria. Emme löytäneet projektiasiakirjoista vaatimusta tällaiselle apurille. Skripti on selväkielistä tekstiä, jota ei ole obfuskoitu.

Käyttämätön kokoraja

Skripti asettaa muuttujan THRESHOLD arvoksi 100 ja pyytää Gitiltä luetteloa muuttuneista tiedostonimistä. Se alustaa muuttujan TRIGGER nollaksi.

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

Silmukan sisällä se laskee arvon SIZE. Vertailua muuttujaan THRESHOLD ei ole, eikä mikään sijoitus muuta muuttujaa TRIGGER. Latauslohko suoritetaan, kun TRIGGER on nolla.

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

Skriptin normaalilla suorituspolulla ehto on tosi, vaikka muuttuneiden tiedostojen luettelo olisi tyhjä. Raja-arvo ei rajoita latausta.

Alkuperäiset rivinumerot on säilytetty. TRIGGER pysyy nollana. THRESHOLD määritellään, mutta sitä ei koskaan käytetä vertailussa.

Alkuperäiset rivinumerot on säilytetty. TRIGGER pysyy nollana. THRESHOLD määritellään, mutta sitä ei koskaan käytetä vertailussa.

Erilliset lataukset Linuxille, macOS:lle ja Windowsille

Komennon uname -s palauttama arvo määrää latauspolun ja paikallisen tiedostonimen.

Tunnistettu järjestelmä Palvelinpolku Paikallinen tiedostonimi
Linux /api/l run-command.sh
Darwin / macOS /api/m run-command.sh
MINGW, MSYS, CYGWIN, Windows_NT /api/w run-command.cmd
Tunnistamaton järjestelmä /api/l run-command.sh

URL-osoitteilla on yhteinen palvelinnimi, joka on tässä korvattu paikkamerkillä <DOWNLOAD_DOMAIN>. Säilytimme peittämättömän koukun yksityisesti. Ehdolliset haarat kattavat Linuxin, macOS:n ja Windowsin, ja tunnistamattoman järjestelmän varavaihtoehtona on Linux. Emme testanneet suorittamista näissä järjestelmissä.

Tiedoston lataaminen ja sen suorittamisen yrittäminen

Koukku tallentaa tiedoston sijaintiin ${TMPDIR:-/tmp} käyttäen ohjelmaa curl tai ohjelmaa wget, jos curl ei ole saatavilla. Allekirjoitusta tai odotettua tiivistettä ei tarkisteta ennen seuraavia suoritusohjeita.

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

Lopussa oleva et-merkki käynnistää komennon taustalle. Sekä vakiotuloste että vakiovirhetuloste ohjataan kohteeseen /dev/null.

Suoritusyrityksen jälkeen koukku kirjoittaa merkkijonon azuku väliaikaishakemistossa olevaan tiedostoon .git-checker. Se ei koskaan tarkista tämän merkkitiedoston olemassaoloa ennen uutta latausta. Se ei myöskään odota taustaprosessin onnistumista ennen tiedoston kirjoittamista. Merkkitiedosto voisi siis olla olemassa epäonnistuneenkin suoritusyrityksen jälkeen.

Alkuperäiset lataus-, chmod-, taustasuoritus- ja merkkitiedoston kirjoitusohjeet. Toisen vaiheen ohjelma ei sisälly tähän otteeseen.

Alkuperäiset lataus-, chmod-, taustasuoritus- ja merkkitiedoston kirjoitusohjeet. Toisen vaiheen ohjelma ei sisälly tähän otteeseen.

Loppupuolella olevassa kommentissa kehotetaan poistamaan väliaikainen lataushakemisto. Sen alla ei ole poistokomentoa.

Oliko arkiston sisään piilotettu sovellus?

Verkkolataus herätti toisen kysymyksen. Oliko arkistossa jo sovellus, kenties Git-historiassa tai salassapitosopimuksessa? Tarkastelimme säiliöiden rajoja, minkä jälkeen purimme jokaisen toimitetun Git-objektin ja tarkastimme DOCX-tiedoston sisällön.

Arkiston rajat

Kirjasimme alkuperäisen arkiston SHA-256-tiivisteen ennen sen sisällön tarkastamista.

6f44ff4e461828dd1fe6ede75ca8d9d4b579c2ac223463629e9a7537b9df5040

Gzipin purkaminen datana tuotti 890,880 tavun TAR-virran. Gzip-virta päättyi asianmukaisesti, eikä sen jälkeen ollut käyttämättömiä tavuja. Viimeisen TAR-merkinnän jälkeiset viimeiset 5,120 tavua olivat nollatäytettä.

Tämän jälkeen tarkastelimme tiedostoja ja objekteja, jotka näiden säiliömerkintöjen sisältö kattoi.

Tallennetut gzip-virran lopun ja TAR-täytteen tarkistukset. Näytteen koodia ei suoritettu.

Tallennetut gzip-virran lopun ja TAR-täytteen tarkistukset. Näytteen koodia ei suoritettu.

Koukun löytäminen TAR-otsakkeesta

Merkinnän post-checkout otsake alkaa puretussa TAR-virrassa kohdasta 0xCF600 eli 849,408. Sen tiedostodata alkaa kohdasta 849,920. Nämä siirtymät viittaavat TAR-virtaan, eivät pakattuun .gz-tiedostoon.

Tässä kohdassa otsake alkaa post-checkout-tiedoston polulla.

TAR / heksadesimaalinen vedos

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  |................|

TAR-otsakkeessa mode sijaitsee tavuissa [100:108] ja size tavuissa [124:136]. Tämän merkinnän dekoodatut kentät esitetään vedoksen jälkeen.

TAR-kenttä Raakatavut / arvo
mode b'0000777\x00'
size b'00000005326\x00'
Oikeustila oktaalilukuna 0777
Koko desimaalilukuna 2774 tavua
Tallennettu / laskettu tarkistussumma 10301 / 10301

Oktaalimuotoinen koko vastaa 2,774 tavua. Tallennettu otsakkeen tarkistussumma on 10,301. Kun se lasketaan uudelleen siten, että tarkistussummakenttä täytetään välilyönneillä, tulos on sama.

Koukun TAR-otsakkeen raakatavut ja dekoodatut kentät. Sen nimi, oikeudet ja koko näkyvät säiliön tavuissa.

Koukun TAR-otsakkeen raakatavut ja dekoodatut kentät. Sen nimi, oikeudet ja koko näkyvät säiliön tavuissa.

Laskimme myös tästä merkinnästä poimitun koukun tiivisteen.

854b3b88b06fad9d9ffec36b35be0133b1d502084d4d7cce232eda2b2dd03092

Artikkelin mukana ovat TAR-merkinnän vedos ja anonymisoitu koukku. Yllä oleva tiiviste yksilöi yksityisesti säilytetyn peittämättömän alkuperäiskappaleen, ei julkaistua peitettyä kopiota.

Git-objektien lukeminen ilman checkout-toimintoa

Hakemistossa .git/objects on 24 irrallista objektia, joista kukin on tallennettu zlib-virtaan. Purettu data sisältää Git-otsakkeen ja sen jälkeen objektin rungon.

<type> <size>\0<body>

Tarkistimme ilmoitetun rungon pituuden ja laskimme SHA-1-tiivisteen koko dekoodatusta tavujonosta, mukaan lukien otsake ja NUL-tavu. Tuloksen on vastattava tiedostonimessä olevaa objektitunnistetta. Tämä tarkistaa objektin eheyden. Se ei kerro mitään siitä, kuka objektin loi.

Vertasimme jokaisen objektin ilmoitettua pituutta rungon pituuteen ja tarkistimme tiivisteen koko dekoodatusta datasta.

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

Tarkistimme myös zlib-virtojen loput. Objektit jakautuvat 16 blob-objektiin, 5 tree-objektiin ja 3 commit-objektiin. Kolmen haaran kärkien, niiden vanhempien commitien ja alipuiden seuraaminen kattaa kaikki 24 objektia. Toimitettujen objektien joukossa ei ole tavoittamattomia blob-objekteja.

Git / commitien väliset suhteet

master 4bc26f6c18910ca777c8238d2f88f6e725fcdc3f
  tree   feb0feaf7b8e826b085e90dea5399772d7b91f02
  parent (none)

conf   239b9aa2edc8c5e21fddeea5ed0e937496ae013f
  tree   048b51f9673f94354251ce16a78e663c71667a4c
  parent 4bc26f6c18910ca777c8238d2f88f6e725fcdc3f

NDA    a1311875d86bf6f1a6b9f2fee6527abbd1ce647d
  tree   cc020d922090835ea4ac3a3e418d0213d7a2ad94
  parent 239b9aa2edc8c5e21fddeea5ed0e937496ae013f

Täydellinen objektiluettelo sisältää myös nykyisen työpuun ulkopuoliset objektit.

Kaikkien 24 Git-objektin luettelo

Objektitunniste Tyyppi Runko, tavua
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

Pituus ja SHA-1 tarkistettiin kunkin objektin alkuperäisestä Git-koodauksesta. Kaikki 24 tarkistusta läpäistiin.


Salassapitosopimuksen jäljittäminen puusta tavuihin

Haara NDA osoittaa puuhun, joka sisältää yhden tiedoston: Non-Disclosure-Agreement.docx. Gitin puumerkintä tallentaa oikeustilan ja tiedostonimen tekstinä, minkä jälkeen tulevat NUL-tavu ja blob-tunnisteen 20 raakatavua. Jäsensimme merkinnän suoraan puun rungosta.

Git-puu / heksadesimaalinen vedos

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.\.-.|

NDA-puun raakatavut ja dekoodattu viittaus sen DOCX-blob-objektiin.

NDA-puun raakatavut ja dekoodattu viittaus sen DOCX-blob-objektiin.

Merkintä viittaa seuraavaan blob-objektiin.

5a51550933b593eb65da458bbdd579f85c082dab

Zlib-purkamisen jälkeen objekti alkaa merkkijonolla blob 752100\0. Heti otsakkeen jälkeen tulevat tavut 50 4b 03 04, jotka ovat ZIP-säiliön PK-tunniste.

Git-blob / zlib-purkamisen jälkeen

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|

Pakatun objektin tavut, dekoodattu Git-otsake ja DOCX-tiedoston alku. Pituus ja objektitunniste tarkistettiin koko objektista.

Pakatun objektin tavut, dekoodattu Git-otsake ja DOCX-tiedoston alku. Pituus ja objektitunniste tarkistettiin koko objektista.

Rungon pituus on 752,100 tavua. Sen SHA-256 vastaa analyysia varten erikseen tallentamamme DOCX-tiedoston tiivistettä.

9d85170d2c0aa7a9b90dfc3855715a31d971bba7abb563e9efa1153fdc15634f

Nämä objektit kattavat polun NDA-haarasta asiakirjan tavuihin.

Kaikkien 16 blob-objektin selvittäminen

Viisitoista blob-objektia dekoodautuu UTF-8-koodatuiksi Markdown-projektiasiakirjoiksi. Jäljelle jäävä blob-objekti on edellä kuvattu DOCX. Yksikään ei ala PE-, ELF- tai Mach-O-otsakkeella.

Polku puissa Koko, tavua Tyyppi / ensimmäiset tavut
04-solution-proposal-guidance.md 2054 UTF-8-teksti · 23 20 44 65 76 65 6c 6f 70 6d 65 6e 74 20 43 6f
06-blockchain-architecture.md 6497 UTF-8-teksti · 23 20 42 6c 6f 63 6b 63 68 61 69 6e 20 41 72 63
07-blockchain-integration-specification.md 2807 UTF-8-teksti · 23 20 42 6c 6f 63 6b 63 68 61 69 6e 20 49 6e 74
08-smart-contract-specification.md 2610 UTF-8-teksti · 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-teksti · 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-teksti · 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-teksti · 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-teksti · 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-teksti · 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-teksti · 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-teksti · 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-teksti · 23 20 44 65 70 6c 6f 79 6d 65 6e 74 2c 20 4d 6f
Intro/01-project-overview.md 8402 UTF-8-teksti · 23 20 50 72 6f 6a 65 63 74 20 4f 76 65 72 76 69
Intro/02-product-requirements.md 3191 UTF-8-teksti · 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-teksti · 23 20 41 49 20 46 72 61 75 64 20 44 65 74 65 63

Kaikki 16 toimitettua blob-objektia on luokiteltu. Puut sisältävät projektiasiakirjoja, eikä tuotteen toteutusta löytynyt.

Kaikki 16 toimitettua blob-objektia on luokiteltu. Puut sisältävät projektiasiakirjoja, eikä tuotteen toteutusta löytynyt.

Luimme myös tekstirungot niiden tunnisteiden tarkistamisen lisäksi. DOCX oli ainoa muuta kuin tekstiä sisältävä blob-objekti, ja sen säiliö piti tarkastaa erikseen.

DOCX-tiedoston avaaminen ZIP-arkistona

Asiakirja sisältää 25 ZIP-merkintää: 17 tiedosto-osaa ja 8 hakemistoa. Luimme jokaisen tiedosto-osan ja tarkistimme sen CRC:n.

DOCX-osa Koko, tavua 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-osien nimet, pituudet ja CRC32-arvot. Tarkastelimme ZIP- ja XML-dataa avaamatta asiakirjaa Officessa.

DOCX-osien nimet, pituudet ja CRC32-arvot. Tarkastelimme ZIP- ja XML-dataa avaamatta asiakirjaa Officessa.

Osaluettelossa ei ole vbaProject.bin-tiedostoa eikä OLE-liitettä. Kaksi PNG-tiedostoa sisältävät logon ja allekirjoituskuvan. Tarkastimme myös XML-suhteet ja löysimme viittauksen paikalliseen Office-mallipolkuun asiakirjan tekijän koneella. Emme selvittäneet viittauksen kohdetta emmekä ladanneet sitä.

Allekirjoituskuva ja Gitin tekijäkentät eivät anna meille luotettavaa keinoa tunnistaa lähettäjää. Molemmat voidaan kopioida tai korvata.

Emme löytäneet toimitetusta sisällöstä erillistä sovellusta tai tuotteen toteutusta. Koukku hankkii seuraavan ohjelmansa verkosta. Säiliöiden tarkastuksemme ei sulje pois kaikkia mahdollisia hyväksikäyttö- tai steganografiatekniikoita.

Mitä latauspalvelin palautti

Noudimme kolme täsmällistä URL-osoitetta datana suorittamatta vastauksia tai seuraamatta uudelleenohjauksia. Kukin palautti 19. lokakuuta kello 17:29:27–17:29:28 UTC HTTP-tilakoodin 200. Kaikkien kolmen vastausrunko oli sama 21 tavun viesti.

Permanently suspended

Kolme tallennettua päätepistehavaintoa. Emme tehneet latausohjelman URL-osoitteisiin uusia pyyntöjä tämän artikkelin valmistelun aikana.

Kolme tallennettua päätepistehavaintoa. Emme tehneet latausohjelman URL-osoitteisiin uusia pyyntöjä tämän artikkelin valmistelun aikana.

Meillä ei ole toisen vaiheen tavuja takaisinmallinnettavaksi. Emme myöskään tiedä, mitä nämä päätepisteet palauttivat aiemmin, toiselle kävijälle tai erilaisilla pyyntöehdoilla. Palvelun keskeyttämisestä kertova viesti ei anna meille varmennettua selitystä keskeyttämisen syystä.

Koukku yrittää ladata ja suorittaa ulkoisen tiedoston. Väitteet varastetuista salasanoista, tokeneista, lähdekoodista tai lompakoista edellyttäisivät näyttöä, jota meillä ei ole.

Olisiko tämä voinut olla laillinen apuohjelma?

Sisäinen päivitysohjelma voisi päätyä arkistoon vahingossa. Git-koukuilla, taustaprosesseilla ja curl-ohjelmalla on kaikilla laillisia käyttötarkoituksia.

Tämän toimituksen sähköpostissa meitä pyydettiin nimenomaisesti siirtymään toiseen haaraan. Tämä voisi kutsua toimitettua latausohjelmaa, vaikka ilmoitettu syy haaran vaihtamiseen oli sopimuksen lukeminen. Sähköpostissa ei mainittu suorittamista. Emme myöskään löytäneet yhteyttä selaimen päivitysohjelman ja ehdotetun järjestelmän välillä, ja skriptin kokotarkistus oli puutteellinen.

Käsittelimme toimitusta yrityksenä toimittaa koodia hyökkäystarkoituksessa ja estimme koukun suorittamisen. Tämän arvion uudelleenharkinta edellyttäisi ladattujen tiedostojen lähdekoodia ja todennettavaa selitystä sille, miksi toimeksisaajan olisi pitänyt suorittaa ne salassapitosopimuksen tarkastamiseksi.

Emme ole selvittäneet operaattorin henkilöllisyyttä. Lähettäjän osoite, commit-metatiedot ja asiakirjassa olevat nimet eivät riitä tekijän määrittämiseen.

Analyysikaavio toimitetun koukun kuvaamista suoritusvaiheista.

Analyysikaavio toimitetun koukun kuvaamista suoritusvaiheista.

Tuntemattoman Git-tietovaraston tarkastaminen

Sähköpostin ohjeita noudattava kehittäjä voisi päätyä suorittamisen laukaisevaan kohtaan lukiessaan vielä projektista. Ehdotettua sovellusta ei tarvitsisi kääntää tai käynnistää.

Jos tarkastat asiakkaiden toimituksia koneella, jolla on tuotannon SSH-avaimia tai pilvipalvelutokeneita, odottamaton skripti saattaa päästä niihin käsiksi. Kertakäyttöisen ympäristön on pidettävä nämä tunnistetiedot ulottumattomissa. Tarkastuskoneen selainistunnot ansaitsevat saman huomion.

Tarkastuksen tulisi kattaa toimitettu .git-hakemisto ja mahdollinen IDE-automaatio ennen kuin insinööri alkaa käyttää tavallisia komentojaan. Myös asennusskriptit on tutkittava. Koneen lokeista etsisimme tapahtumia, joissa Git tai komentotulkki lataa tiedoston väliaikaishakemistoon ja suorittaa sen. Pelkkä curl-prosessi kertoo paljon vähemmän.

Alkuperäisen sähköpostin ja arkiston säilyttäminen mahdollistaa sen, että myöhempi tarkastaja voi varmistaa, mitä toimitettiin. Tiivisteet ja koneen tapahtumat auttavat selvittämään, mitä koneella tapahtui. Merkkitiedoston puuttuminen ei voi osoittaa, ettei ohjelmaa olisi koskaan suoritettu.

Voiko arkiston lataaminen tai purkaminen suorittaa tämän koukun?

Lataaminen ja tavallinen purkaminen eivät itsessään kutsu Gitin post-checkout-koukkua. Tässä näytteessä dokumentoitu laukaisuehto on se, että Git päivittää työpuun checkout- tai switch-toiminnolla ja koukun suorittaminen on sallittu. Tarkastelimme toimitettuja objekteja suoraan kutsumatta näitä toimintoja.

Arkiston tarkastamisen jälkeen

Odotimme seuraavan keskustelun koskevan arkkitehtuuria ja toimituspäivämääriä. Lähetimme sen sijaan vastauksen koukusta ja säilytimme aineiston lisätutkimuksia varten. Emme vieläkään voi sanoa, mitä etäohjelma teki tai kuka sitä operoi. Koukku antoi riittävän syyn keskeyttää pyydetty Git-työnkulku.

SToFU Systems ja ratkaisumme ovat yli viiden vuoden ajan auttaneet yrityksiä suojaamaan järjestelmiään, myös liikekirjeenvaihdon ja kehitysaineiston kautta toimitettavilta hyökkäyksiltä. Tietoturva-auditoinneissamme tutkitaan, miten koodia ja käyttöoikeuksia voidaan käyttää väärin. Tarjoamme myös takaisinmallinnusta, kun tiimin on ymmärrettävä tuntematonta ohjelmistoa.

Jos tietovarasto tai binääritiedosto herättää kysymyksiä, keskustele tiimimme kanssa teknisestä tarkastuksesta ennen sen tuomista tavalliseen kehitysympäristöösi.

Kirjeenvaihto ja todistusaineistotiedostot

Alla olevissa neljässä viestissä käytetään paikkamerkkejä henkilönimien, osoitteiden, kolmansien osapuolten identiteettien ja tunnistavien linkkien tilalla. Muilta osin uusien viestien sanamuoto on säilytetty. Toistetut lainaukset on jätetty pois, koska kukin sähköposti esitetään erikseen. Myös verkkolomakkeen palvelun IP-osoite ja asiaan liittymättömien vastaanottajien osoitteet on jätetty julkaisematta.

1. Ensimmäinen tiedustelu verkkosivustomme kautta

Sähköposti / tunnistetiedot korvattu

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.
---

Ensimmäinen tiedustelu verkkosivustomme kautta. Säilytetyn sähköpostin anonymisoitu julkaisunäkymä.

Ensimmäinen tiedustelu verkkosivustomme kautta. Säilytetyn sähköpostin anonymisoitu julkaisunäkymä.

Yksityisen, peittämättömän EML-tiedoston SHA-256: bf7d0f3a59b84f509ca436e0750640e844e9731ce363a42a99d5be60cdf8597e


2. Vastauksemme, jossa pyysimme aineistoa

Sähköposti / tunnistetiedot korvattu

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>

Vastauksemme, jossa pyysimme aineistoa. Säilytetyn sähköpostin anonymisoitu julkaisunäkymä.

Vastauksemme, jossa pyysimme aineistoa. Säilytetyn sähköpostin anonymisoitu julkaisunäkymä.

Yksityisen, peittämättömän EML-tiedoston SHA-256: 1e5330dd82e02911254722744a3202e9b761c8c1d2950be937cd5d539c1bcad9


3. Arkiston sisältävä sähköposti, jossa nimettiin NDA / conf -haarat

Sähköposti / tunnistetiedot korvattu

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>

Arkiston sisältävä sähköposti, jossa nimettiin NDA / conf -haarat. Säilytetyn sähköpostin anonymisoitu julkaisunäkymä.

Arkiston sisältävä sähköposti, jossa nimettiin NDA / conf -haarat. Säilytetyn sähköpostin anonymisoitu julkaisunäkymä.

Yksityisen, peittämättömän EML-tiedoston SHA-256: f7007ed3053d3ba2ef71ea01c74ec0c4aebfd48417f757ecec8d9d7d5884bf33


4. Vastauksemme koukun löytymisen jälkeen

Sähköposti / tunnistetiedot korvattu

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

Vastauksemme koukun löytymisen jälkeen. Säilytetyn sähköpostin anonymisoitu julkaisunäkymä.

Vastauksemme koukun löytymisen jälkeen. Säilytetyn sähköpostin anonymisoitu julkaisunäkymä.

Yksityisen, peittämättömän EML-tiedoston SHA-256: 31df91adb2eb52be2171836d3e26610328a0a1a1273dbf7d56efe4354bb62e19


Koko koukun anonymisoitu näkymä

Kaikki 101 lähderivinumeroa on säilytetty. Tunnistetiedot on peitetty harmailla suorakulmioilla.

Kaikki 101 lähderivinumeroa on säilytetty. Tunnistetiedot on peitetty harmailla suorakulmioilla.


Peittämättömät alkuperäiskappaleet säilytetään yksityisesti. Julkisissa todistusaineistotiedostoissa käytetään paikkamerkkejä ja kuvakaappauksissa läpinäkymättömiä harmaita suorakulmioita. Alkuperäisiksi merkityt tiivisteet yksilöivät yksityisen lähteen, eivät muokattua julkaisukopiota. Kuvat ovat paikallisten todistusaineistonäkymien kuvakaappauksia, joista tunnistava teksti on poistettu ennen renderöintiä. Vastaanotettua koodia ei suoritettu.

SToFU Systems

SToFU Systems

Takaisin Blogeihin

Ota yhteyttä

Aloita keskustelu

Muutama selkeä rivi riittää. Kuvaile järjestelmä, paine ja päätös, joka on jumissa. Tai kirjoita suoraan osoitteeseen midgard@stofu.io.

0 / 10000
Tiedostoa ei ole valittu