- Entropy, büyük kod tabanlarında yüksek entropili satırları tarayarak gizli değer gibi görünen dizeleri bulan bir CLI aracıdır
- Yüksek entropili satırlar, secret olma olasılığı yüksek hedefler olarak değerlendirilir ve kod tabanındaki açığa çıkmış gizli değerleri bulmaya odaklanır
- Kurulum ve çalıştırma için Go kaynak kurulumu,
go run, Homebrew ve Docker yöntemleri sunulur
- Çalıştırma seçenekleri olarak
-top, -ext, -ignore-ext ile sonuç sayısı, dahil edilecek uzantılar ve hariç tutulacak uzantılar belirtilebilir
- Docker ile çalıştırırken yerel dosya sisteminin taranması için mevcut dizin
/data konumuna mount edilmeli ve komutun sonuna /data eklenmelidir
Entropy ne yapar?
- Entropy, kod tabanlarını tarayarak yüksek entropili satırları bulan bir CLI aracıdır
- Yüksek entropili satırlar çoğu zaman gizli değer olduğundan, kod tabanlarında secret sızıntılarını bulmaya yardımcı olur
Kurulum ve çalıştırma yöntemleri
-
Go ile kurulum
- Önerilen kurulum yöntemi, Go kullanarak kaynaktan kurulumdur
- Kurulumdan sonra
entropy komutuyla çalıştırılır
go install github.com/EwenQuim/entropy@latest
entropy
- Tek satırda çalıştırma yöntemi de sunulur
go run github.com/EwenQuim/entropy@latest
-
Homebrew ile kurulum
- Homebrew kurulum komutu aşağıdaki gibidir
brew install ewenquim/repo/entropy
entropy
-
Docker ile çalıştırma
- Docker ile çalıştırma, mevcut dizini konteynerin
/data dizinine mount etme yöntemiyle yapılır
docker run --rm -v $(pwd):/data ewenquim/entropy /data
Başlıca seçenek örnekleri
-h: Kullanılabilir seçenekleri gösterir
entropy -h
-top: Çıktılanacak en üst sonuç sayısını belirtir
-ext: Taranacak uzantıları belirtir
entropy -top 20 -ext go,py,js
-ignore-ext: Hariç tutulacak uzantıları belirtir
- Dosyalar ve klasörler birlikte argüman olarak verilebilir
entropy -top 5 -ignore-ext min.js,pdf,png,jpg,jpeg,zip,mp4,gif my-folder my-file1 my-file2
Docker kullanırken dikkat edilmesi gerekenler
- Docker’ın
-v seçeneği, mevcut dizini konteynerin içine mount etmek için kullanılır
/data, aracın dosyaları aradığı varsayılan dizindir
- Komutun sonuna
/data eklenmezse yerel dosya sistemi yerine konteyner içi aranır
docker run --rm -v $(pwd):/data ewenquim/entropy -top 20 -ext go,py,js /data
docker run --rm -v $(pwd):/data ewenquim/entropy -top 5 /data/my-folder /data/my-file
1 yorum
Hacker News yorumları
İlginç. Ben yapsaydım, yüksek entropi iyi sıkıştırılamaz ilkesinden yola çıkarak muhtemelen şöyle bir şey yapardım:
perl -lne 'next unless $_; $z = qx(echo "$_" | gzip | wc -c); printf "%5.2f %s\n", $z/length($_), $_'Ancak bu yöntem tüm dosya yerine her satırı sözlük gibi kullandığı için, çok kısa satırlar iyi sıkıştırılamıyor ve bu da biraz sorun çıkarıyor.
return map { $_ > 1 ? 1 : ($_ < 0 ? 0 : $_) } @vs;gibi bir satıra tepki verdi; geçerli kod olsa da gerçekten de entropisi epey yüksek görünüyor.Buna karşılık doğal dilde İngilizce bir yorum eklerseniz, yüksek entropili satırı tespit edemeyecek şekilde kandırmak da mümkün oldu.
Yoldayım, ayrıntılı bakamıyorum ama bu Perl komutuyla bu aracı karşılaştırmak ilginç olabilir. Perl komutunun avantajı, Windows olmayan neredeyse her makinede doğrudan çalışması; bu yüzden benimsenmesi için illa çok güçlü olması gerekmiyor.
Bu sırada Go’yla ve benim acemi programımla sürekli dalga geçti; istemeden de olsa o gün Ruby de epey öğrenmiş oldum.
Tüm kod dosyalarını birleştirip ardından depo genelinde satır satır test etmek de mümkün olabilir, ama muhtemelen çok yavaş olur.
xz veya zstd daha iyi seçenekler olabilir; en iyi sıkıştırma oranının daha iyi bir entropi tahmini anlamına geldiği bakış açısıyla Hutter Prize [1] kazananlarına da bakılabilir.
[1] http://prize.hutter1.net/
Elbette açarken de o sözlüğü ayrıca girdi olarak vermek gerekecektir.
Bu sorunu tüm veritabanı parolalarını
abcdyaparak aştım."ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"satırını yüksek entropili satır olarak yakaladı.parola: postgres
"correct horse battery staple"yalnızca sıradan görünen bir kelime dizisi olduğu için düşük entropili gibi duruyor.Bu tür işlerde entropinin nasıl kullanıldığını anlatan iyi bir yazı var mı merak ediyorum. İnsanların bunu pratikte nasıl kullandığını ve işe yarayıp yaramadığını uzun zamandır merak ediyordum, ama kendim araştırmadım.
Öncelikle metnin “entropisini” nasıl tanımlayacağımız bile belirsiz. Burada
-Sum(x log(x)), yani kabacax = countOccurences(char) / len(text)gibi basit bir tanım kullanılmış; bunun gerçekte ne kadar iyi çalıştığı konusunda birçok soru doğuyor.Bir dizge ne kadar uzun olmalı? Doğal dilin neredeyse sabit bir entropisi var mı? Daha iyi bir yaklaşım var mı?
Örneğin
"vorpal","hJ6&:a"dan “bariz biçimde” daha düşük entropili olmalı gibi geliyor. İkincisi doğal dilden çok daha büyük bir karakter kümesi kullanıyor gibi görünüyor; öyle olmasa bile karakter sırası önemli, bu yüzden ilki Carroll’ın uydurduğu bir kelime olsa da gerçek bir kelime gibi duyuluyor.Ama herkesin kullandığı bu “entropi” bunların hiçbirini bilmez. İkisi tam olarak aynı “entropiye” sahip olacaktır.
Bir GitHub parola arayıcısı daha yapmak için yeterince iyi çalışabilir, ama daha iyisi var mı merak ediyorum. Metnin rastgeleliğini daha anlamlı biçimde ölçen bir metrik var mı?
Bu tür projelerden onlarca var ve hepsi “entropi”yi doğal kabul ediyor, ama bu konuda düzgün bir araştırma görmedim.
Bir şey bir kodlamada karmaşık görünebilir, ama doğru kodlamada düşük entropili olabilir.
Bir sinyalin entropisini doğru değerlendirmek için doğru tabanı bilmeniz ya da bağlamdan çıkarmanız gerekir.
Asıl yazıdaki aracı daha güçlü yapmak için kaynak kodu veya doğal dil gibi tipik metin alanları için önceden hesaplanmış birkaç sözlük bulundurup, her sözlükle dizgeyi kodlayarak sıkıştırılabilirliği karşılaştırmak iyi olur.
Gizli değerler gibi yüksek entropili dizgeler, kullanılabilir tüm sözlükler karşısında iyi sıkıştırılamayacaktır.
Rastgele olmayan veriyi rastgele veriden ayırt edebilmemizin nedeni, olası tüm durumlar içinde insanlar için yararlı kabul edilen durumların yalnızca küçük bir altküme olması ve bu altkümenin neye benzediğini bir ölçüde bildiğimiz için belirli bir dizgenin hangi süreçle üretildiğini tahmin edebilmemizdir.
Elbette https://en.wikipedia.org/wiki/Diehard_tests gibi istatistiksel testler düşük entropili veriyle yüksek entropili veriyi ayırt etmek için yeterince iyidir, ama günümüz sözde rastgele sayı üreteçleri bu testlerin hepsini geçmekte sorun yaşamaz. Gerçek “entropi” yalnızca tohum değeri ve algoritmanın karmaşıklığı kadar olsa bile.
Birlikte bakmaya değer araçlar:
trufflehog: https://github.com/trufflesecurity/trufflehog
detect-secrets: https://github.com/Yelp/detect-secrets
semgrep secrets: https://semgrep.dev/products/semgrep-secrets -- ücretli ama duruma göre mevcut lisansa dahil olabilir
Bu çözümlerin gizli değerleri bulma konusunda entropi tabanlı basit yaklaşımdan çok daha iyi olduğunu düşünüyorum
Entropinin daha genel olduğu doğru, ama bu araçlar zaten iyi yerleşmiş durumda ve gerçekten çok sayıda veri kümesinden geçerek doğrulanmışlar
Birkaç yıl önce yüksek entropili dizenin ne olduğunu sorup[0], konuyla ilgili iyi bir yazı[1] bağlayan DrJones sayesinde faydasını gördüm
[0] https://news.ycombinator.com/item?id=13304641
[1] https://www.splunk.com/en_us/blog/security/random-words-on-e...
Uzun süredir kullandığım ent programı aklıma geldi
https://fourmilab.ch/random/
Projenin tüm git geçmişini de tarasa faydalı olur gibi. Gizli değer commit edilip daha sonra kaldırılmış olsa bile geçmişte hâlâ kalmış olabilir
Bu aracı çalıştırmak için neden Go kurmam gerektiğini anlamıyorum. Go'nun avantajlarından biri, geliştiricinin doğrudan çalışan tek bir binary dağıtabilmesi değil miydi?
Docker imajı da yapmayı planlıyorum
Açıkçası bu kadar popüler olacağını bilmiyordum, bu yüzden depo henüz %100 hazır durumda değil
Llama 3 gibi dil modelleri, token bazında şaşırtıcılık düzeyini modelleyerek en şaşırtıcı bölgeleri, yani entropinin en yüksek olduğu bölgeleri tespit edebilir gibi
Örneklerden birindeki gibi tüm alfabe bazı açılardan yüksek entropili olabilir; ancak koda aşina bir dil modeli, bir kod tabanında Base62 alfabesinin sabit olarak bulunmasını hiç şaşırtıcı görmeyebilir