2 poin oleh GN⁺ 2024-06-06 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2024-06-06
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 tinggi
    Sebaliknya, 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

    • Dulu saya belajar Go sambil mengerjakan soal Advent of Code, dan setiap kali saya menyelesaikan soal, teman serumah saya memaksa saya menunjukkan kodenya lalu menulis ulang solusi Go saya yang panjangnya 10~50 baris menjadi one-liner Ruby
      Dia terus-menerus mengejek Go dan program saya yang payah, dan tanpa sengaja saya jadi banyak belajar Ruby hari itu
    • Mungkin metrik yang lebih adil adalah mengukur ukuran file memakai semua baris kecuali baris yang sedang diuji, lalu mengukurnya lagi setelah baris itu ditambahkan, sehingga selisih ukuran menjadi indikatornya
      Bisa juga menggabungkan semua file kode lalu mengujinya per baris di seluruh repositori, tetapi sepertinya akan terlalu lambat
    • Saya akan memakai kompresor yang lebih baik daripada gzip, tetapi trik ini sudah pernah saya pakai beberapa kali
      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/
    • Saya penasaran apakah ada alat baris perintah seperti zip yang bisa mendefinisikan kamus lebih dulu dari satu atau lebih file, lalu memakai kamus itu untuk mengompresi file kecil
      Tentu saat dekompresi kamus itu juga harus diberikan sebagai input terpisah
    • Saya memakai secret scanner milik Yelp sebagai hook pre-commit, dan konfigurasinya cukup mudah berkat mekanisme instalasi pre-commit
  • Masalah ini teratasi dengan menjadikan semua kata sandi database sebagai abcd

    • Di codebase kami, alat ini menemukan "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890" sebagai baris berentropi tinggi
    • Nama pengguna: postgres
      Kata sandi: postgres
    • Ini mengingatkan saya pada https://xkcd.com/936/. "correct horse battery staple" tampaknya akan menjadi entropi rendah karena hanya terlihat seperti rangkaian kata biasa
  • Saya 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-kira x = countOccurences(char) / len(text), dan saya punya banyak pertanyaan tentang seberapa baik ini benar-benar bekerja
    Seberapa 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 Carroll
    Tetapi “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

    • Entropi adalah ukuran kompleksitas atau tingkat ketidakteraturan suatu sinyal. Bagian menariknya adalah bahwa ketidakteraturan itu bersifat relatif terhadap basis atau kamus yang tepat
      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
    • Entropi dari string tertentu bukanlah konsep matematis yang ketat. Menurut definisinya, string yang sudah diketahui hanya bisa memiliki satu nilai, jadi “entropi”-nya menjadi 0 bit
      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
    • Kompleksitas Kolmogorov dari string arbitrer tidak dapat dihitung
  • 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

    • PyWhat juga layak dilihat untuk menemukan string menarik dan nilai rahasia: https://github.com/bee-san/pyWhat
    • noseyparker juga cukup bagus: https://github.com/praetorian-inc/noseyparker
      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?

    • Karena ini alat keamanan, langsung memercayai biner sejak awal justru bertentangan dengan tujuannya. Kalau ada source code, setidaknya kita punya opsi untuk memeriksa apa yang sebenarnya dilakukan
    • Saya ingin memasukkannya ke Homebrew, tetapi PR-nya ditolak, jadi sepertinya saya harus membuat brew tap sendiri atau meyakinkan mereka agar menerimanya
      Image Docker juga akan dibuat
      Sejujurnya saya tidak menyangka ini akan jadi sepopuler ini, jadi repositorinya memang belum 100% siap
    • Kontainer Docker sekarang sudah bisa digunakan, dan sudah didokumentasikan di homepage
  • 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