JavacDoor, Kompilyasiya Vaxtında İşləyən Maven Zərərli Proqramı

JavacDoor: Quraşdırma Zamanı Yox, Kompilyasiya Zamanı İşləyən Maven Artefaktı

TL; DR

Maven Mərkəzinin əsəri kimi nəşr olunub io.github.davidtimur:c2-lab doqquz buraxılış göndərdi, bunlardan səkkizi, jar-ı annotasiya prosessoru yoluna yerləşdirən istənilən aşağı axın layihəsinin tərtib edilməsi zamanı uzaqdan giriş yükünü yerinə yetirdi. Heç bir tətbiq kodu onu idxal etməli deyildi. Heç bir mənbə sətri ona istinad etməli deyildi. Nə quraşdırma skripti, nə quraşdırma sonrası ekvivalenti, nə də yoxlamaq üçün heç bir həyat dövrü çəngəli yox idi.

İcra vektoru jar daxilindəki tək 46 baytlıq fayldır: tətbiq edən sinfə ad verən Java xidmət təminatçısı qeydiyyatı javax.annotation.processing.ProcessorJava kompilyatoru bu cür qeydiyyatları avtomatik olaraq aşkar edir. Tapıldıqdan sonra, javac kompilasiyanın normal bir hissəsi kimi sinifi işə salır və işlədir. Bu o deməkdir ki, faydalı yükün işləmə mühiti qurma maşınıdır, hazırda qurma maşını mövcud olduğu yeganə işi görür.

Doqquz buraxılışda əmr və idarəetmə kanalı üç dəfə yenidən quruldu: operator tərəfindən təmin edilən geri çağırış URL-i, sonra ngrok TCP tuneli üzərindəki tərs qabıq, daha sonra yolları iki dəfə daha dəyişən HTTP sorğu kanalı. Son buraxılışda JVM standart olaraq no-op TLS etibar meneceri quraşdırıldı, kompilyasiya müddəti ərzində istənilən sertifikatı qəbul edir.

Artefaktın öz POM-unda və MIT lisenziyasında "C2 Lab Payload" sözləri var idi. Müşahidə etdiyimiz bütün müddət ərzində Maven Central-da canlı yayımlanırdı və o vaxtdan bəri bütünü ilə birlikdə çıxarılıb io.github.davidtimur qrup.

Anatomiya: icra mühərriki kimi kompilyator

Java-nın annotasiya emalı çərçivəsi kitabxanaların kompilyasiya zamanı kod yarada bilməsi üçün mövcuddur — bu mexanizm Lombok, Dagger və ORM və seriallaşdırma alətlərinin uzun siyahısının arxasındakı mexanizmdir. Prosessor özünü jar daxilində düz mətn faylı ilə elan edir:

META-INF/services/javax.annotation.processing.Processor

Təsirə məruz qalan hər bir buraxılışdakı həmin faylın məzmunu, sözbəsöz və tam şəkildə:

io.github.davidtimur.c2lab.C2Prosessor

Fayl, md5-in 1.0.1-dən 1.0.8-ə qədər olan versiyalarında bayt baxımından eynidir. 7d2a08a5c8869a47eea9fa62487dfbe4. 1.0.0 versiyasında bu yoxdur.

Zaman yava dili İşləyir, bu xidmət girişləri üçün annotasiya prosessoru yolunu skan edir və tapdıqlarını yükləyir. Kompilyasiya edilən layihədə heç bir şey prosessordan bəhs etməyə, heç bir şeyə annotasiya qoymağa və ya heç bir şeyi konfiqurasiya etməyə ehtiyac duymur. Yolda mövcudluq kifayətdir. Bu, JavacDoor-u əksər alətlərin ətrafında qurulmuş təchizat zənciri nümunələrindən fərqləndirən xüsusiyyətdir:

modelTriggerGörünən kimi
npm quraşdırma çəngəlinpm installscripts.postinstall manifestdə
Python idxal vaxtı yükümodulun ilk idxalımənbədə modul səviyyəli ifadə
JavacDoorjavac istənilən aşağı axın layihəsindəxidmət qeydiyyatı fayl adı

Quraşdırma hooku manifestdə bir bəyannamədir və manifest hər kəsin oxuduğu ilk şeydir. İdxal vaxtı yükü ən azı oxunaqlı mənbədə yerləşir. Xidmət qeydiyyatı heç biri deyil: bu, bir fayl adı və bir sinfi adlandıran bir sətirdir və davranış kompilyasiya edilmiş bayt kodunda bir qovluqdan uzaqda yerləşir.

Yük sinfi özü hücum edərək ana kəşfiyyatını həyata keçirir. Kompilyasiya edilmiş siniflərin sabit hovuzları aşağıdakıları ehtiva edir / bin / sh, Mən kiməm, uname-a, pwd Unix yolunda və tapşırıq siyahısı Windows yolunda, ilə birlikdə YönləndirməXətaStream Uşaq prosesinin səhv çıxışını tutulan axına birləşdirmək üçün. İki JSON şablonu hostdan nəticələri daşıyır — qeydiyyat mayak:

{"host":"%s","os":"%s","user":"%s","dir":"%s"}

əhalisi olan hostname əmr və OS adı, istifadəçi adıvə istifadəçi.dir sistem xüsusiyyətləri və nəticədə geri çağırış:

{"version":"%s","host":"%s","time":"%s","output":"%s"}

Kompilyatorun öz çıxışında qalan irəliləyiş markerləri qeyri-adi dərəcədə səmimidir: [C2] kompilyasiya zamanı icra tamamlandı, [C2] geri zəng göndərildi → HTTP , [C2] qabığı qoşulub .

Doqquz buraxılış, üç C2 nəsli

Buraxılışlar bir faydalı yükün doqquz nüsxəsi deyil. Onlar iterasiya jurnalıdır və onları ardıcıllıqla oxumaq, çatdırılma vektorunun sabit qaldığı müddətdə kanalın yenidən qurulduğunu göstərir.

BuraxınKompilyasiya zamanı avtomatik icra olunurKanal
1.0.0yox (xidmət faylı yoxdur)Yalnız operator tərəfindən təmin edilən geri çağırış URL-i
1.0.1bəli (vektor təqdim edildi)Operator tərəfindən təmin edilən geri çağırış URL-i
1.0.2bəliTərs qabıq, ngrok TCP tuneli
1.0.3bəliHTTP kanalı, /qeydiyyatdan keç /cmd /çıxış
1.0.4bəliHTTP kanalı, /qeydiyyatdan keç /cmd /çıxış
1.0.5bəliHTTP kanalı, /qeydiyyatdan keç /poll /out
1.0.6bəliHTTP kanalı, /qeydiyyatdan keç /poll /out
1.0.7bəliHTTP kanalı, /register /cmd
1.0.8bəliHTTP kanalı + TLS doğrulaması deaktiv edildi

Həmin cədvəldəki üç detalın hər biri artefakt dəstinin necə oxunmalı olduğunu dəyişdirdiyindən, onları nəzərdən keçirməyə dəyər.

Vektor 1.0.2 deyil, 1.0.1-ə çatır. 1.0.0 versiyası eyni kəşfiyyat və geri çağırış məntiqini daşıyır, lakin xidmət faylı və annotasiya emalı idxalı yoxdur; yalnız bir şey onu çağırdıqda işləyir. 1.0.1 versiyasından xidmət faylı mövcuddur və kompilyasiya edilmiş siniflər idxal olunur javax.annotation.processing.DəstəklənənMənbəVersiyasıİki biletli buraxılışı — 1.0.0 və 1.0.2 — müqayisə edən hər hansı bir qiymətləndirmə, nəyinsə dəyişdiyini düzgün şəkildə müəyyən edir, lakin harada olduğunu səhv müəyyən edir.

Əks qabıq tam olaraq bir buraxılışda mövcuddur. 1.0.2 buraxılışı ehtiva edir 0.tcp.ngrok[.]io, log xətti [C2] qabığı 0.tcp.ngrok[.]io:19823-ə qoşulub, interaktiv banner c2-qabıqvə çərçivə terminatoru __SON__1.0.3-dən sonrakı buraxılışlarda bunlardan heç biri yoxdur və əvəzində HTTPS hostuna çatır. Yalnız qeydiyyatdan keçmiş buraxılışları adlandıran silinmə sorğusu, sonrakı altı buraxılışda mövcud olan canlı HTTP kanalını qeyd etmədən tərk edərkən ölü TCP son nöqtəsinə istinad edərdi.

Son buraxılış nəqliyyat yoxlamasını silir. 1.0.8 buraxılışı tətbiq edən bir sinif əlavə edir javax.net.ssl.X509TrustManager sertifikat yoxlama metodları heç bir nəticə verməyən, həmişə doğru olan host adı doğrulayıcısı vasitəsilə qeydiyyatdan keçmişdir setDefaultHostnameVerifierVə etibarAll hər ikisini JVM-in standart parametrləri kimi quraşdıran rutin. Nəticə budur ki, həmin kompilasiyanın qalan hissəsi üçün JVM istənilən hostdan istənilən sertifikatı qəbul edir — yalnız faydalı yükün öz trafiki üçün deyil, həm də quruluşun sonradan TLS üzərindən etdiyi hər hansı bir şey üçün.

HTTP kanalı, istifadə edən altı buraxılışın hamısında, tək bir host tərəfindən ön plana çıxarılır: süfrə dolusu şövqlə dəli.ngroksuz[.]devHər sorğu başlığı daşıyır ngrok-skip-brauzer-xəbərdarlığı, bu da pulsuz ngrok tunellərinin brauzerlərə xidmət etdiyi ara səhifəni basdırır. Yol dəstləri buraxılışlar arasında dəyişir — /çıxış 1.0.7-də yox olur və /cmd ilə əvəzlənir /sorğu — amma ev sahibi heç vaxt dəyişmir.

Özünü təcrid etmək deyir

1.0.1 versiyasından etibarən hər POM, artefaktın öz quruluşu üçün bir kompilyator arqumenti təyin edir:

-proc:heç biri

Bu bayraq annotasiya emalını deaktiv edir. Buradakı təsiri əvvəlcədəndircise: prosessoru ehtiva edən layihə özü kompilyasiya edildikdə, prosessor işləmir.

Bu bayraq tamamilə adi istifadə üçün nəzərdə tutulub. Annotasiya prosessoru göndərən layihə, adətən, açılış zamanı həmin prosessoru özünə tətbiq etməkdən çəkinməlidir və build-tool sənədləri məhz bunu tövsiyə edir. Təkcə götürəndə heç nəyi sübut etmir.

Lakin prosessorun gördüyü işlərlə birlikdə götürüldükdə, bu, spesifik bir asimmetriyanı təsvir edir: kod artefakt quran maşında deyil, artefaktla kompilyasiya edən hər kəsin maşınlarında icra olunur. Bayraq xidmət faylını təqdim edən eyni buraxılışda — 1.0.1 — və ondan sonrakı hər buraxılışda görünür. “Kompilyasiya zamanı icrasının başladığı buraxılış” ilə “kompilyasiya zamanı icrasının yerli olaraq söndürüldüyü buraxılış” arasındakı korrelyasiya artefakt dəstindəki ən faydalı analitik siqnaldır və heç nəyi dekompilyasiya etmədən düz mətnli POM-da görünür.

Təsiri qeyd edib orada dayanırıq. Artefaktlarda bayrağın niyə qoyulduğuna dair heç bir məlumat yoxdur.

Daha bir metaməlumat, əsasən onu məhv etmək üçün qeyd olunmağa layiqdir. POM layihəni “C2 Lab Fayload” adlandırır, onu “C2 laboratoriya fayload artefaktı” kimi təsvir edir və MIT lisenziyası verir. Bu cür özünü etiketləmə bəzən paketin tədqiqat işi olduğuna dair dəlil kimi təqdim olunurciscanlı təhdiddən daha çox, bəzən bu oxuma düzgün olur — əlçatan infrastrukturu olmayan elan edilmiş kanareyka bundan fərqli bir obyektdir. Bu, burada tətbiq olunmur. Doqquz buraxılış ərzində üç dəfə yenidən qurulmuş, istənilən istehlakçı tərəfindən əlçatan ictimai depoya dərc edilmiş funksional implant, metaməlumatlarının nə adlandırmasından asılı olmayaraq canlı bir qabiliyyətdir. POM-dakı ad, ona qarşı kompilyasiya edən bir maşında baş verənlər haqqında heç nəyi dəyişdirmir.

Quraşdırma maşınları üçün göstəricilər

Əgər bu artefaktla bağlı bir quruluş hostu kompilyasiya edilibsə, dəlil diskdəki davamlı bir implantda deyil, quruluş qeydlərində və şəbəkə telemetriyasında yerləşir - faydalı yük kompilyator prosesinin içərisində işləyir və onunla birlikdə çıxır.

jar və ya yerli depo keşində

  • META-INF/services/javax.annotation.processing.Processor adqoyma io.github.davidtimur.c2lab.C2Processor
  • Xidmət faylı md5 7d2a08a5c8869a47eea9fa62487dfbe4
  • Aşağıdakı siniflər io/github/davidtimur/c2lab/: C2Processor, C2Task, Task, və 1.0.8-də daxili sinif Task$1

Quruluş çıxışında

  • [C2] compile-time execution complete
  • [C2] callback sent → HTTP
  • [C2] callback failed:
  • [C2] shell connected to
  • İnteraktiv banner c2-shell; çərçivə terminatoru __END__

Prosesdə telemetriya

  • javac valideyn kimi /bin/sh -c (Unix) və ya Windows əmr tərcüməçisi
  • Uşaq əmr edir whoami, uname -a, pwd (Unix) və ya tasklist (Windows) kompilyasiya addımı ilə valideynlik edir

Şəbəkə telemetriyasında

  • Gedən TCP-yə 0.tcp.ngrok[.]io:19823 (buraxılış 1.0.2)
  • HTTPS-ə tableful-fervor-crazed.ngrok-free[.]dev, yollar /register, /cmd, /poll, /out (1.0.3-dən 1.0.8-ə qədər buraxılışlar)
  • Başlıq sorğusu ngrok-skip-browser-warning: true
  • Cisimlərin uyğunluğunu tələb edin {"host":...,"os":...,"user":...,"dir":...} or {"version":...,"host":...,"time":...,"output":...}

Konfiqurasiyada

  • Ətraf mühit dəyişənləri CALLBACK, CALLBACK_URL; sistem xüsusiyyəti callback.url

Naşir metadatası

  • qrup io.github.davidtimur; naşirin ünvanı davudboi999@gmail[.]comimza açarı E520C345EF94423D

1.0.8 versiyasını işlədən bir versiya əlavə bir yoxlama tələb edir. Həmin versiya JVM-də standart olaraq icazə verən bir etibar meneceri quraşdırdığı üçün, eyni JVM-də sonradan edilən hər hansı bir TLS bağlantısı - asılılıq həlli, artefakt yükləmə, yerləşdirmə addımı - sertifikat təsdiqlənməsi olmadan davam etdi. Həmin pəncərədən gələn trafik təsdiqlənmiş hesab edilməməlidir.

Niyə tərtib edilmiş artefaktların fərqli skan edilməsinə ehtiyac var

JavacDoor faydalı bir sınaq nümunəsidir, çünki iki ümumi fərziyyəni eyni anda məğlub edir və heç bir uğursuzluq hər hansı bir satıcının alətlərinə xas deyil.

İlk fərziyyə, təhlükəli kodun özünü manifestdə elan etməsidir. Təchizat zənciri alətlərinin böyük bir hissəsi həyat dövrü ətrafında təşkil edilmişdir hooks, çünki npm və PyPI üçün adətən hərəkət məhz orada olur. JavacDoor-da heç bir hook yoxdur. Onun tetikleyicisi adı Java interfeysi və məzmunu sinif adı olan xidmət qeydiyyatı faylıdır. Bunu statik olaraq tutmaq üçün META-INF/services/javax.annotation.processing.Processor özü-özlüyündə bir icra giriş nöqtəsi kimi, a ilə bərabər quraşdırma sonrası skript — və sonra adlandırılmış sinfi baytkoda izləyin. Ekosistemlərin bu formada öz avtomatik kəşf mexanizmləri var və alətlərin onu bir kimi saymasından asılı olmayaraq hər biri giriş nöqtəsidir.

İkinci fərziyyə, sətirlərin mənbə fayllarında yerləşməsidir. Bir jar üçün son nöqtələr, shell əmrləri, JSON şablonları və jurnal markerləri hamısı sabit hovuzlardadır .sinif faylları. Mətnin greps edilməsi ilə heç nə tapmayan alətlər — sətirlərin qarışıq olmasına görə deyil, mətn skanının təhlil etmədiyi strukturlaşdırılmış ikili konteynerdə olduqlarına görə. Bu yazıdakı hər bir şəbəkə göstəricisi sabit hovuz təhlilindən çıxdı. Onlardan biri tam formalıdır. https:// URL sinif faylının içərisində açıq şəkildə görünür; jar-ın oxuna bilən məzmununun mətn skan edilməsi hələ də onu üzə çıxara bilməyəcək. Burada məğlub ediləcək kodlaşdırma yoxdur, yalnız oxunacaq konteyner formatı var.

Hər iki boşluq eyni formaya malikdir: artefakt formatı müəyyən edilmiş semantikaya malik bir struktur kimi deyil, fayl paketi kimi qəbul edilmişdir. Düzəldici xoşagəlməzdir — konteyneri təhlil edin, ekosistemin öz avtomatik kəşf giriş nöqtələrini sadalayın və onları kompilyasiya edilmiş koda daxil edin. Xüsusilə, qurulma vaxtı vektorları üçün üçüncü yoxlama ucuz və təəccüblü dərəcədə diaqnostikdir: artefaktın istehlakçılara nə etdiyini özünü azad etdiyi şeylə müqayisə edin. Kompilyasiya vaxtı prosessorunu qeydiyyatdan keçirən və eyni zamanda öz quruluşu üçün kompilyasiya vaxtı emalını deaktiv edən artefakt, iki sətir düz mətn POM-da özü haqqında bir şey söylədi.

Bu gün Maven artefaktlarını istehlak edən komandalar üçün üç praktik tədbir aşağıdakılardır:

  • Annotasiya prosessoru yolunu icra sərhədi kimi qəbul edin. Oraya enən asılılıqlar, quruluşunuzda kod işlədir. Quruluşun annotasiya emalına ehtiyacı olmadığı hallarda, -proc:heç biri müdafiə baxımından burada lokal olaraq olduğu qədər faydalıdır; olduğu yerlərdə, prosessor dəstini kompilyasiya sinif yolundan miras almaq əvəzinə, onu açıq şəkildə pinləyin.
  • Loq kompilyatorunun alt prosesləri. Bir qabığı yaradan kompilyasiya addımı əksər layihələrdə anomaldır və əhəmiyyətsiz dərəcədə xəbərdarlıq edilə bilər.
  • Metadataları ifadə kimi qəbul etməyin. Paket adındakı və ya təsvirindəki “Lab”, “test”, “faydalı yük” və “PoC” əhatə dairəsi məhdudiyyətləri deyil. Əlçatanlıq və davranış məhdudiyyətləridir.

Artefakt və onun bütün qrupu çıxarıldı Maven Hesabatımızdan sonra Mərkəzi; həm artefakt yolu, həm də qrup yolu indi 404 qaytarır və Mərkəzi indeks uyğun koordinatların olmadığını bildirir. Bu, bu artefaktı bağlayır. Java kompilyatorunun sənədləşdirilmiş xüsusiyyəti olan və jar dərc edən hər kəs üçün əlçatan olan vektoru bağlamır.

References

Bu yazıda heç bir xarici mənbəyə istinad edilməyib. Bütün tapıntılar, Maven Central-dan çıxarılmadan əvvəl əldə edilmiş doqquz dərc olunmuş bankanın birbaşa statik təhlilidir. Artefaktlardan heç bir kod icra edilməyib.

sca-tools-proqram-kompozisiya-analiz-alətləri
Proqram təminatı risklərinizi prioritetləşdirin, aradan qaldırın və təhlükəsizləşdirin
Pulsuz Hesabınızı əldə edin.
Kredit kartı tələb olunmur.

Proqram təminatınızın hazırlanmasını və çatdırılmasını təmin edin

Xygeni Məhsul Dəsti ilə