2 puan yazan GN⁺ 2024-06-06 | 1 yorum | WhatsApp'ta paylaş
  • 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

 
GN⁺ 2024-06-06
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.

    • Uzun zaman önce Advent of Code problemleri çözerken Go öğrenmiştim; her problem çözdüğümde ev arkadaşım kodu göstermem için ısrar eder, sonra Go ile 10–50 satır olan çözümümü tek satırlık Ruby olarak yeniden yazardı.
      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.
    • Test edilen satır hariç dosyanın tüm satırlarıyla dosya boyutunu ölçüp, sonra o satırı ekleyerek tekrar ölçmek; boyut farkını daha adil bir gösterge yapabilir gibi görünüyor.
      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.
    • gzip’ten daha iyi bir sıkıştırıcı kullanırdım ama bu hileyi birkaç kez kullandım.
      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/
    • zip gibi komut satırı araçları içinde, bir veya daha fazla dosyayla sözlüğü önceden tanımlayıp sonra o sözlükle küçük dosyaları sıkıştırabilen bir şey var mı merak ediyorum.
      Elbette açarken de o sözlüğü ayrıca girdi olarak vermek gerekecektir.
    • Yelp’in secret scanner aracını pre-commit hook’u olarak kullanıyorum; pre-commit’in kurulum mekanizmasıyla epey kolay ayarlanıyor.
  • Bu sorunu tüm veritabanı parolalarını abcd yaparak aştım.

    • Bizim kod tabanımızda bu araç "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890" satırını yüksek entropili satır olarak yakaladı.
    • kullanıcı adı: postgres
      parola: postgres
    • https://xkcd.com/936/ aklıma geliyor. "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 kabaca x = 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.

    • Entropi, bir sinyalin karmaşıklığını veya düzensizlik derecesini ölçen bir metriktir. İlginç olan, bu düzensizliğin uygun bir tabana veya sözlüğe göre göreli olmasıdır.
      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.
    • Belirli bir dizgenin entropisi katı anlamda matematiksel bir kavram değildir. Tanım gereği, zaten bilinen bir dizge yalnızca tek bir değere sahip olabileceğinden “entropi” 0 bit olur.
      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.
    • Rastgele bir dizgenin Kolmogorov karmaşıklığı hesaplanamaz.
  • 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

    • İlginç dizeleri ve gizli değerleri bulmak için PyWhat da bakmaya değer: https://github.com/bee-san/pyWhat
    • noseyparker da fena değil: https://github.com/praetorian-inc/noseyparker
      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?

    • Güvenlik aracı olduğu için baştan bir binary'ye güvenmek amaca ters düşer. Kaynak kod varsa en azından gerçekte ne yaptığını inceleme seçeneği vardır
    • Homebrew'e eklemek istemiştim ama PR reddedildi; bu yüzden kendi brew tap'imi oluşturmam ya da kabul etmeleri için ikna etmem gerekecek gibi
      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
    • Docker container artık kullanılabiliyor ve ana sayfada dokümante edilmiş durumda
  • 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