Python programlama dilinin resmi kod deposu olan PyPI’ye (Python Paket Dizini) yakın zamanda 400’den fazla kötü amaçlı paket yüklendi.
451 paketin tamamı yakın zamanda bulundu güvenlik firması Phylum tarafından neredeyse aynı kötü amaçlı yükleri içeriyordu ve hızlı bir şekilde art arda gelen patlamalar halinde yüklendi. Paketler yüklendikten sonra, virüslü cihazda bir tarayıcı her açıldığında yüklenen kötü amaçlı bir JavaScript uzantısı oluşturur; bu, kötü amaçlı yazılımın yeniden başlatmalarda kalıcı olmasını sağlayan bir hiledir.
JavaScript, virüs bulaşmış geliştiricinin panosunu kendisine kopyalanabilecek herhangi bir kripto para birimi adresi için izler. Bir adres bulunduğunda, kötü amaçlı yazılım bu adresi saldırgana ait bir adresle değiştirir. Amaç: geliştiricinin farklı bir tarafa yapmayı amaçladığı ödemeleri engellemek.
Kasım ayında Phylum tespit edilen düzinelerce Yüzlerce kez indirilen ve aynı şeyi gizlice yapmak için yüksek düzeyde kodlanmış JavaScript kullanan paketler. Özellikle:
- Sayfada bir metin alanı oluşturuldu
- Herhangi bir pano içeriği yapıştırıldı
- Yaygın kripto para birimi adres biçimlerini aramak için bir dizi normal ifade kullanıldı
- Tanımlanan tüm adresler, daha önce oluşturulan metin alanında saldırgan tarafından kontrol edilen adreslerle değiştirildi
- Metin alanını panoya kopyaladı
Phylum Baş Teknik Sorumlusu Louis Lang, Kasım ayı gönderisinde, “Herhangi bir noktada güvenliği ihlal edilmiş bir geliştirici bir cüzdan adresini kopyalarsa, kötü amaçlı paket adresi saldırganın kontrolündeki bir adresle değiştirecektir.” “Bu gizli bulma/değiştirme, son kullanıcının istemeden parasını saldırgana göndermesine neden olacak.”
Yeni gizleme yöntemi
En son kampanya, yüklenen kötü amaçlı paketlerin sayısını büyük ölçüde artırmanın yanı sıra izlerini kapatmak için önemli ölçüde farklı bir yol kullanıyor. Kasım ayında açıklanan paketler, JavaScript’in davranışını gizlemek için kodlamayı kullanırken, yeni paketler, aşağıdaki tabloda bulunan Çince dil ideogramlarının rastgele 16 bitlik kombinasyonları gibi görünen işlevler ve değişken tanımlayıcıları yazıyor:
Unicode kod noktası | ideograf | Tanım |
---|---|---|
0x4eba | insanlar | Adam; insanlar; insanlık; başkası |
0x5200 | bıçak | bıçak; Eski madeni para; ölçüm |
0x53e3 | ağız | ağız; açık uç; giriş kapısı |
0x5973 | dişi | kadın, kız; kadınsı |
0x5b50 | Çocuk | çocuk; meyve, tohum |
0x5c71 | Dağ | dağ, tepe, zirve |
0x65e5 | Gün | güneş; gün; gündüz |
0x6708 | ay | ay; ay |
0x6728 | odun | ağaç; ahşap, kereste; ahşap |
0x6c34 | su | su, sıvı, losyon, meyve suyu |
0x76ee | göz | göz; bak, gör; bölüm, konu |
0x99ac | atış | atış; soyadı |
0x9a6c | atış | atış; soyadı |
0x9ce5 | kuş | kuş |
0x9e1f | kuş | kuş |
Bu tabloyu kullanarak, kod satırı
''.join(map(getattr(__builtins__, oct.__str__()[-3 << 0] + hex.__str__()[-1 << 2] + copyright.__str__()[4 << 0]), [(((1 << 4) - 1) << 3) - 1, ((((3 << 2) + 1)) << 3) + 1, (7 << 4) - (1 << 1), ((((3 << 2) + 1)) << 2) - 1, (((3 << 3) + 1) << 1)]))
yerleşik işlevi oluşturur chr
ve işlevi tamsayılar listesine eşler [119, 105, 110, 51, 50]
. Ardından satır, onu en sonunda oluşturan bir dizgede birleştirir. 'win32'
.
Phylum araştırmacıları açıkladı:
Bu tür çağrılardan bir dizi görebiliriz.
oct.__str__()[-3 << 0]
. bu[-3 << 0]
değerlendirir[-3]
Veoct.__str__()
diziye göre değerlendirilir'<built-in function oct>'
. Python’un dizin operatörünü kullanma[]
ile bir dize üzerinde-3
bu durumda dizinin sonundaki 3. karakteri alır'<built-in function oct>'[-3]
değerlendirecek'c'
. Buradaki diğer 2’de bununla devam etmek bize'c' + 'h' + 'r'
ve karmaşık bit düzeyinde aritmetiği basitçe değerlendirmek, bize şu kalıyor:''.join(map(getattr(__builtins__, 'c' + 'h' + 'r'), [119, 105, 110, 51, 50]))
bu
getattr(__builtins__, 'c' + 'h' + 'r')
sadece bize yerleşik işlevi verirchr
ve sonra haritalarchr
int listesine[119, 105, 110, 51, 50]
ve sonra hepsini bir dizide birleştirir ve sonuçta bize verir.'win32'
. Bu teknik, kodun tamamı boyunca devam eder.
Araştırmacılar, yalnızca kodun çalıştığında ne yaptığını gözlemleyerek, son derece karmaşık bir kod görünümü verirken, tekniğin nihayetinde yenilmesinin kolay olduğunu söyledi.
En son kötü amaçlı paket grubu, geliştiricilerin şu meşru paketlerden birini indirirken yaptıkları yazım hatalarından yararlanmaya çalışır:
- bitcoinlib
- ccxt
- kripto karşılaştırma
- kripto besleme
- freqtrade
- selenyum
- solana
- yılan
- web yuvaları
- finans
- pandalar
- matplotlib
- aiohttp
- güzel çorba
- tensör akışı
- selenyum
- cılız
- kolorama
- scikit-öğren
- meşale
- pygame
- pyinstaller
Örneğin meşru vyper paketini hedefleyen paketler, tek bir karakteri atlayan veya çoğaltan ya da doğru ismin iki karakterini aktaran 13 dosya adı kullandı:
- yper
- vper
- Görüntüleme
- vızıltı
- vvyper
- vyyper
- vıcık vıcık
- dolandırıcı
- vyperr
- yvper
- vpyer
- yıkanmış
- yıkamak
Araştırmacılar, “Bu tekniğin bir komut dosyasıyla otomatikleştirilmesi son derece kolaydır (bunu okuyucu için bir alıştırma olarak bırakıyoruz) ve meşru paketin adının uzunluğu arttıkça, olası yazım hataları da artar” diye yazdı. “Örneğin, sistemimiz 38 yazım hatası tespit etti. cryptocompare
adlı kullanıcı tarafından neredeyse aynı anda yayınlanan paket pinigin.9494
”
Meşru paketlerin adlarına çok benzeyen meşru kod havuzlarında kötü amaçlı paketlerin mevcudiyeti, en az 2016 yılında bir üniversite öğrencisinin 214 bubi tuzaklı paket yükledi meşru paketlerin biraz değiştirilmiş adlarını içeren PyPI, RubyGems ve NPM depolarına. Sonuç: Sahte kod, 17.000’den fazla ayrı alanda 45.000’den fazla kez çalıştırıldı ve yarısından fazlasına güçlü yönetici hakları verildi. Sözde yazım hatası saldırıları sahip olmak yıldızı parladı durmadan o zamandan beri.
Phylum araştırmacılarının bulduğu 451 kötü amaçlı paketin tümünün adları, blog gönderisi. Hedeflenen yasal paketlerden birini indirmeyi amaçlayan herhangi birinin, istemeden kötü niyetli bir görsel ikiz elde edip etmediğini tekrar kontrol etmesi kötü bir fikir değildir.