- Entropy एक CLI टूल है जो बड़े codebase में high-entropy lines को स्कैन करके secret जैसी दिखने वाली strings ढूँढता है
- high-entropy lines को secret होने की अधिक संभावना वाले targets माना जाता है, और इसका फोकस codebase के भीतर exposed secrets खोजने पर है
- इंस्टॉल और रन करने के लिए Go source install,
go run, Homebrew, और Docker तरीके उपलब्ध हैं
- रन options में
-top, -ext, -ignore-ext का उपयोग करके results की संख्या, शामिल extensions, और excluded extensions तय किए जा सकते हैं
- Docker में चलाते समय current directory को
/data पर mount करना होता है और local filesystem स्कैन करने के लिए command के अंत में /data जोड़ना जरूरी है
Entropy क्या करता है
- Entropy एक CLI टूल है जो codebase को स्कैन करके high-entropy lines ढूँढता है
- high-entropy lines अक्सर secret values होती हैं, इसलिए यह codebase में secret leakage खोजने में मदद करता है
इंस्टॉल और रन करने के तरीके
-
Go से इंस्टॉल
- सुझाया गया इंस्टॉलेशन तरीका Go का उपयोग करके source install करना है
- इंस्टॉल के बाद इसे
entropy कमांड से चलाया जाता है
go install github.com/EwenQuim/entropy@latest
entropy
- one-line execution तरीका भी उपलब्ध है
go run github.com/EwenQuim/entropy@latest
-
Homebrew से इंस्टॉल
- Homebrew इंस्टॉलेशन कमांड इस प्रकार है
brew install ewenquim/repo/entropy
entropy
-
Docker से चलाना
- Docker रन current directory को container के
/data पर mount करने के तरीके से किया जाता है
docker run --rm -v $(pwd):/data ewenquim/entropy /data
मुख्य options के उदाहरण
-h: उपलब्ध options देखता है
entropy -h
-top: आउटपुट में दिखाए जाने वाले top results की संख्या तय करता है
-ext: स्कैन की जाने वाली extensions तय करता है
entropy -top 20 -ext go,py,js
-ignore-ext: exclude की जाने वाली extensions तय करता है
- files और folders को साथ में arguments के रूप में दिया जा सकता है
entropy -top 5 -ignore-ext min.js,pdf,png,jpg,jpeg,zip,mp4,gif my-folder my-file1 my-file2
Docker उपयोग करते समय ध्यान देने वाली बातें
- Docker का
-v option current directory को container के अंदर mount करने के लिए उपयोग होता है
/data वह default directory है जहाँ टूल files खोजता है
- अगर command के अंत में
/data नहीं जोड़ा गया, तो local filesystem के बजाय 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 टिप्पणियां
Hacker News की राय
दिलचस्प। अगर मैं करता, तो high entropy वाली चीज़ें अच्छी तरह compress नहीं होतीं वाले सिद्धांत पर कुछ इस तरह करता
perl -lne 'next unless $_; $z = qx(echo "$_" | gzip | wc -c); printf "%5.2f %s\n", $z/length($_), $_'हालांकि इस तरीके में पूरी फ़ाइल के बजाय हर line को dictionary की तरह इस्तेमाल किया जाता है, इसलिए बहुत छोटी lines अच्छी तरह compress नहीं होतीं और थोड़ी दिक्कत आती है
return map { $_ > 1 ? 1 : ($_ < 0 ? 0 : $_) } @vs;जैसी line पर इसने प्रतिक्रिया दी, और valid code होने के बावजूद सच में उसकी entropy काफ़ी high लगती हैउल्टा, natural-language English comment जोड़ दें तो high entropy line को detect न कर पाने के लिए इसे धोखा भी दिया जा सकता था
मैं चलते-फिरते हूँ, इसलिए detail में नहीं देख पा रहा, लेकिन इस Perl command और इस tool की तुलना करना मज़ेदार होगा। Perl command का फायदा यह है कि Windows को छोड़कर लगभग हर machine पर सीधे चल जाती है, इसलिए अपनाए जाने के लिए इसका बहुत powerful होना ज़रूरी नहीं
साथ-साथ वह Go और मेरे अनगढ़ program का मज़ाक उड़ाता रहा, और अनजाने में उस दिन मैंने Ruby भी काफ़ी सीख ली
सभी code files को जोड़कर पूरे repository पर line-by-line test भी कर सकते हैं, लेकिन शायद वह बहुत slow होगा
xz या zstd बेहतर choice हो सकते हैं, और “best compression ratio यानी बेहतर entropy estimate” के नजरिए से Hutter Prize [1] winners को भी देख सकते हैं
[1] http://prize.hutter1.net/
बेशक decompress करते समय भी वह dictionary अलग input के रूप में देनी पड़ेगी
इस समस्या को हमने सभी database passwords
abcdरखकर पार कर लिया है"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"को high entropy line के रूप में पकड़ लियाpassword: postgres
"correct horse battery staple"तो बस सामान्य दिखने वाले words की string है, इसलिए शायद इसकी low entropy होगीजानना चाहूँगा कि ऐसे कामों में entropy के इस्तेमाल के तरीके पर कोई अच्छी post है क्या। लोग इसे असल में कैसे इस्तेमाल करते हैं और यह कितना effective है, यह मुझे लंबे समय से जानने की इच्छा थी, लेकिन खुद खोदकर नहीं देखा
सबसे पहले तो text की “entropy” को define करना भी अस्पष्ट है। यहाँ यह बस
-Sum(x log(x)), यानीx = countOccurences(char) / len(text)जैसा सरल तरीका है, लेकिन यह असल में कितना काम करता है, इस पर कई सवाल उठते हैंstring कितनी लंबी होनी चाहिए? क्या natural language में लगभग स्थिर entropy होती है? क्या कोई बेहतर approach है?
उदाहरण के लिए
"vorpal"की entropy"hJ6&:a"से “स्पष्ट रूप से” कम होनी चाहिए। दूसरा natural language से कहीं बड़े character set का इस्तेमाल करता दिखता है, और अगर ऐसा न भी हो, तो character order महत्वपूर्ण है—पहला Carroll का गढ़ा हुआ शब्द है, फिर भी असली word जैसा लगता हैलेकिन सब जिस “entropy” का इस्तेमाल करते हैं, उसे इन बातों का बिल्कुल पता नहीं। दोनों की “entropy” बिल्कुल समान होगी
यह शायद एक और GitHub password finder के लिए पर्याप्त रूप से काम कर सकता है, लेकिन जानना चाहूँगा कि क्या इससे बेहतर कुछ है। text की randomness को अधिक meaningful तरीके से मापने का कोई metric है क्या?
ऐसे दर्जनों projects हैं और सब “entropy” को स्वाभाविक मानकर इस्तेमाल करते हैं, लेकिन इस विषय पर मैंने कोई ढंग की research नहीं देखी
कोई चीज़ एक encoding में complex दिख सकती है, लेकिन सही encoding में low entropy हो सकती है
signal की entropy को सही ढंग से judge करने के लिए सही basis पता होना चाहिए, या context से infer करना चाहिए
मूल post वाले tool को और मजबूत बनाना हो तो source code या natural language जैसे typical text ranges के लिए पहले से computed कुछ dictionaries रखकर, हर dictionary से string को encode करके compressibility compare करना अच्छा तरीका होगा
secret values जैसी high-entropy strings उपलब्ध सभी dictionaries के साथ अच्छी तरह compress नहीं होंगी
हम non-random data और random data में फर्क इसलिए कर पाते हैं क्योंकि सभी possible states में से इंसानों के लिए उपयोगी माने जाने वाले states केवल एक छोटा subset होते हैं, और वह subset कैसा दिखता है, इसके बारे में हमें कुछ जानकारी होती है, जिससे हम अनुमान लगा सकते हैं कि कोई specific string किस process से generate हुई है
बेशक https://en.wikipedia.org/wiki/Diehard_tests जैसे statistical tests low entropy data और high entropy data में फर्क करने के लिए काफ़ी अच्छे हैं, लेकिन आजकल के pseudorandom generators ऐसे सभी tests pass करने में कोई दिक्कत नहीं रखते। जबकि असली “entropy” बस seed value और algorithm complexity जितनी ही होती है
साथ में देखने लायक tools:
trufflehog: https://github.com/trufflesecurity/trufflehog
detect-secrets: https://github.com/Yelp/detect-secrets
semgrep secrets: https://semgrep.dev/products/semgrep-secrets -- paid है, लेकिन कुछ मामलों में मौजूदा license में शामिल हो सकता है
मुझे लगता है कि ऐसे solutions, entropy-based सरल approach की तुलना में secrets खोजने में कहीं बेहतर हैं
यह सही है कि entropy ज़्यादा general है, लेकिन ये tools पहले से अच्छी तरह स्थापित हैं और वाकई बहुत सारे datasets से गुजरकर validate हो चुके हैं
कुछ साल पहले high-entropy string क्या होती है, यह पूछने[0] और इससे जुड़ा अच्छा article[1] link करने वाले DrJones की वजह से मदद मिली
[0] https://news.ycombinator.com/item?id=13304641
[1] https://www.splunk.com/en_us/blog/security/random-words-on-e...
लंबे समय से इस्तेमाल किए जा रहे ent program की याद आती है
https://fourmilab.ch/random/
अगर project की पूरी git history तक scan कर दे तो उपयोगी होगा। secrets commit होकर बाद में हटाए गए हों, तब भी वे history में अभी भी रह सकते हैं
इस tool को चलाने के लिए Go install करना क्यों ज़रूरी है, समझ नहीं आता। क्या Go की खूबियों में से एक यह नहीं थी कि developer बस चलने वाला single binary distribute कर सकता है?
Docker image भी बनाने की योजना है
सच कहूं तो मुझे उम्मीद नहीं थी कि यह इतना popular हो जाएगा, इसलिए repository अभी 100% तैयार स्थिति में नहीं है
Llama 3 जैसे language model token-wise surprise को model करके सबसे surprising regions, यानी entropy सबसे ज्यादा वाले regions, detect कर सकते हैं
examples में से एक की तरह पूरा alphabet किसी नजरिए से high entropy हो सकता है, लेकिन code से परिचित language model के लिए codebase में Base62 alphabet का constant के रूप में होना बिल्कुल surprising नहीं लगेगा