- Entropy adalah alat CLI yang memindai baris berentropi tinggi di codebase berskala besar untuk menemukan string yang tampak seperti nilai rahasia
- Baris berentropi tinggi diperlakukan sebagai target yang kemungkinan merupakan secret, dengan fokus untuk menemukan nilai rahasia yang terekspos di dalam codebase
- Instalasi dan eksekusi tersedia melalui instalasi dari source Go,
go run, Homebrew, dan Docker
- Dengan opsi eksekusi
-top, -ext, dan -ignore-ext, Anda dapat menentukan jumlah hasil, ekstensi yang disertakan, dan ekstensi yang dikecualikan
- Saat menjalankan dengan Docker, direktori saat ini harus di-mount ke
/data dan /data harus ditambahkan di akhir perintah agar filesystem lokal dapat dipindai
Apa yang dilakukan Entropy
- Entropy adalah alat CLI yang memindai codebase untuk menemukan baris berentropi tinggi
- Karena baris berentropi tinggi sering kali merupakan nilai rahasia, alat ini membantu menemukan kebocoran secret di codebase
Cara instalasi dan menjalankan
-
Instal dengan Go
- Metode instalasi yang direkomendasikan adalah instalasi dari source menggunakan Go
- Setelah instalasi, jalankan dengan perintah
entropy
go install github.com/EwenQuim/entropy@latest
entropy
- Tersedia juga metode eksekusi satu baris
go run github.com/EwenQuim/entropy@latest
-
Instal dengan Homebrew
- Perintah instalasi Homebrew adalah sebagai berikut
brew install ewenquim/repo/entropy
entropy
-
Jalankan dengan Docker
- Menjalankan dengan Docker dilakukan dengan me-mount direktori saat ini ke
/data di dalam container
docker run --rm -v $(pwd):/data ewenquim/entropy /data
Contoh opsi utama
-h: menampilkan opsi yang tersedia
entropy -h
-top: menentukan jumlah hasil teratas yang akan ditampilkan
-ext: menentukan ekstensi yang akan dipindai
entropy -top 20 -ext go,py,js
-ignore-ext: menentukan ekstensi yang akan dikecualikan
- File dan folder dapat diberikan bersama sebagai argumen
entropy -top 5 -ignore-ext min.js,pdf,png,jpg,jpeg,zip,mp4,gif my-folder my-file1 my-file2
Hal yang perlu diperhatikan saat menggunakan Docker
- Opsi
-v pada Docker digunakan untuk me-mount direktori saat ini ke dalam container
/data adalah direktori default tempat alat mencari file
- Jika
/data tidak ditambahkan di akhir perintah, yang akan dicari bukan filesystem lokal melainkan bagian dalam container
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 komentar
Komentar Hacker News
Menarik. Kalau saya yang mengerjakannya, saya mungkin akan memakai prinsip bahwa entropi tinggi tidak mudah dikompresi dan melakukannya seperti ini
perl -lne 'next unless $_; $z = qx(echo "$_" | gzip | wc -c); printf "%5.2f %s\n", $z/length($_), $_'Hanya saja, pendekatan ini memakai tiap baris sebagai kamus, bukan seluruh file, jadi baris yang sangat pendek tidak akan terkompres dengan baik, sehingga agak bermasalah
Baris seperti
return map { $_ > 1 ? 1 : ($_ < 0 ? 0 : $_) } @vs;memang terdeteksi, dan walaupun itu kode yang valid, entropinya memang terlihat cukup tinggiSebaliknya, dengan menambahkan komentar bahasa Inggris alami, saya juga bisa mengelabui deteksi baris berentropi tinggi
Saya sedang di perjalanan jadi belum bisa melihat lebih detail, tetapi akan menarik membandingkan perintah Perl ini dengan alat tersebut. Keunggulan perintah Perl ini adalah bisa langsung dijalankan di hampir semua mesin non-Windows, jadi tidak harus sangat unggul untuk bisa diadopsi
Dia terus-menerus mengejek Go dan program saya yang payah, dan tanpa sengaja saya jadi banyak belajar Ruby hari itu
Bisa juga menggabungkan semua file kode lalu mengujinya per baris di seluruh repositori, tetapi sepertinya akan terlalu lambat
xz atau zstd mungkin pilihan yang lebih baik, dan jika melihat rasio kompresi terbaik sebagai estimasi entropi yang lebih baik, Anda juga bisa melihat karya pemenang Hutter Prize [1]
[1] http://prize.hutter1.net/
Tentu saat dekompresi kamus itu juga harus diberikan sebagai input terpisah
Masalah ini teratasi dengan menjadikan semua kata sandi database sebagai
abcd"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"sebagai baris berentropi tinggiKata sandi: postgres
"correct horse battery staple"tampaknya akan menjadi entropi rendah karena hanya terlihat seperti rangkaian kata biasaSaya penasaran apakah ada tulisan bagus yang membahas pemakaian entropi untuk tugas seperti ini. Sudah lama saya penasaran bagaimana orang benar-benar memakainya dan apakah ini efektif, tetapi belum pernah mendalaminya sendiri
Pertama-tama, bahkan definisi “entropi” teks pun agak kabur. Di sini definisinya sederhana,
-Sum(x log(x)), yaitu kira-kirax = countOccurences(char) / len(text), dan saya punya banyak pertanyaan tentang seberapa baik ini benar-benar bekerjaSeberapa panjang seharusnya sebuah string? Apakah bahasa alami punya entropi yang hampir tetap? Apakah ada pendekatan yang lebih baik?
Misalnya,
"vorpal"seharusnya “jelas” punya entropi lebih rendah daripada"hJ6&:a". Yang kedua tampak memakai himpunan karakter yang jauh lebih besar daripada bahasa alami, dan meskipun tidak begitu, urutan karakter juga penting sehingga yang pertama terdengar seperti kata sungguhan walaupun itu kata buatan CarrollTetapi “entropi” yang dipakai semua orang ini sama sekali tidak mengetahui hal-hal itu. Keduanya akan memiliki “entropi” yang persis sama
Mungkin ini sudah cukup baik untuk semacam pencari kata sandi GitHub, tetapi saya penasaran apakah ada yang lebih baik. Adakah ukuran yang lebih bermakna untuk menilai keacakan teks?
Ada puluhan proyek seperti ini dan semuanya memakai “entropi” seolah-olah itu sudah jelas, tetapi saya belum pernah melihat riset yang benar-benar layak tentang topik ini
Sesuatu bisa tampak kompleks dalam satu pengodean, tetapi memiliki entropi rendah dalam pengodean yang benar
Untuk menilai entropi sinyal dengan tepat, Anda harus mengetahui basis yang benar atau menyimpulkannya dari konteks
Untuk membuat alat di artikel asli lebih kuat, akan bagus jika ada beberapa kamus yang telah dihitung sebelumnya untuk rentang teks umum seperti source code atau bahasa alami, lalu string dikodekan dengan masing-masing kamus itu dan kemampatan-nya dibandingkan
String berentropi tinggi seperti secret kemungkinan tidak akan terkompres dengan baik terhadap kamus mana pun yang tersedia
Alasan kita bisa membedakan data tidak acak dari data acak adalah karena, dari semua kemungkinan keadaan, hanya sebagian kecil yang dianggap berguna bagi manusia, dan kita kurang lebih tahu seperti apa subset itu, sehingga kita bisa memperkirakan proses seperti apa yang menghasilkan string tertentu
Tentu, uji statistik seperti https://en.wikipedia.org/wiki/Diehard_tests cukup bagus untuk membedakan data berentropi rendah dan tinggi, tetapi generator bilangan pseudorandom modern tidak kesulitan lolos dari semua uji itu. Padahal “entropi” yang sebenarnya pada dasarnya hanya nilai seed dan kompleksitas algoritmenya
Alat lain yang layak dilihat:
trufflehog: https://github.com/trufflesecurity/trufflehog
detect-secrets: https://github.com/Yelp/detect-secrets
semgrep secrets: https://semgrep.dev/products/semgrep-secrets -- berbayar, tetapi dalam beberapa kasus bisa termasuk dalam lisensi yang sudah ada
Menurut saya, solusi seperti ini jauh lebih baik untuk menemukan rahasia dibanding pendekatan sederhana berbasis entropi.
Entropi memang lebih umum, tetapi alat-alat ini sudah matang dan benar-benar telah teruji lewat sangat banyak dataset
Ini membantu saya beberapa tahun lalu berkat DrJones, yang menjelaskan apa itu string berentropi tinggi dan menautkan tulisan bagus terkait[0]:
[0] https://news.ycombinator.com/item?id=13304641
[1] https://www.splunk.com/en_us/blog/security/random-words-on-e...
Ini mengingatkan saya pada program ent yang sudah lama saya pakai
https://fourmilab.ch/random/
Akan berguna jika ini juga memeriksa seluruh riwayat git proyek. Rahasia yang pernah ter-commit lalu dihapus belakangan tetap bisa tertinggal di riwayat
Saya tidak mengerti kenapa harus memasang Go untuk menjalankan alat ini. Bukankah salah satu kelebihan Go adalah pengembang bisa mendistribusikan biner tunggal yang langsung jalan?
Image Docker juga akan dibuat
Sejujurnya saya tidak menyangka ini akan jadi sepopuler ini, jadi repositorinya memang belum 100% siap
Model bahasa seperti Llama 3 tampaknya bisa memodelkan tingkat keterkejutan per token untuk mendeteksi area yang paling mengejutkan, yaitu area dengan entropi tertinggi
Seperti salah satu contohnya, seluruh alfabet mungkin punya entropi tinggi dari sudut pandang tertentu, tetapi model bahasa yang terbiasa dengan kode tidak akan menganggap alfabet Base62 sebagai konstanta di codebase sebagai sesuatu yang mengejutkan sama sekali