2 पॉइंट द्वारा GN⁺ 2024-06-06 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • 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
  • Docker image Docker Hub पर उपलब्ध है

मुख्य 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 टिप्पणियां

 
GN⁺ 2024-06-06
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 होना ज़रूरी नहीं

    • बहुत पहले Advent of Code problems हल करते हुए मैंने Go सीखी थी। हर problem solve करने के बाद मेरा housemate code दिखाने की ज़िद करता और फिर Go में 10–50 lines वाले मेरे solution को Ruby की एक line में दोबारा लिख देता
      साथ-साथ वह Go और मेरे अनगढ़ program का मज़ाक उड़ाता रहा, और अनजाने में उस दिन मैंने Ruby भी काफ़ी सीख ली
    • test की जा रही line को छोड़कर file की सभी lines से file size मापें, फिर उस line को जोड़कर दोबारा मापें तो size difference ज़्यादा fair metric हो सकता है
      सभी code files को जोड़कर पूरे repository पर line-by-line test भी कर सकते हैं, लेकिन शायद वह बहुत slow होगा
    • gzip से बेहतर compressor इस्तेमाल करूँगा, लेकिन यह trick मैंने कई बार इस्तेमाल की है
      xz या zstd बेहतर choice हो सकते हैं, और “best compression ratio यानी बेहतर entropy estimate” के नजरिए से Hutter Prize [1] winners को भी देख सकते हैं
      [1] http://prize.hutter1.net/
    • सोच रहा हूँ कि zip जैसे command-line tools में क्या कोई ऐसा है जिससे एक या अधिक files के आधार पर dictionary पहले से define की जा सके, और फिर उसी dictionary से छोटी files compress की जा सकें
      बेशक decompress करते समय भी वह dictionary अलग input के रूप में देनी पड़ेगी
    • Yelp का secret scanner pre-commit hook के तौर पर इस्तेमाल कर रहा हूँ, और pre-commit के installation mechanism से इसे सेट करना काफ़ी आसान है
  • इस समस्या को हमने सभी database passwords abcd रखकर पार कर लिया है

    • हमारे codebase में इस tool ने "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890" को high entropy line के रूप में पकड़ लिया
    • username: postgres
      password: postgres
    • https://xkcd.com/936/ याद आता है। "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 नहीं देखी

    • entropy किसी signal की complexity या disorder मापने का metric है। दिलचस्प बात यह है कि वह disorder किसी उपयुक्त basis या dictionary के सापेक्ष होता है
      कोई चीज़ एक 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 नहीं होंगी
    • किसी specific string की entropy कोई strict mathematical concept नहीं है। definition के अनुसार, पहले से ज्ञात string केवल एक ही value रख सकती है, इसलिए उसकी “entropy” 0 bits होगी
      हम 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 जितनी ही होती है
    • किसी arbitrary string की Kolmogorov complexity computable नहीं होती
  • साथ में देखने लायक 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 में शामिल हो सकता है

    • दिलचस्प strings और secrets खोजने के लिए PyWhat भी देखने लायक है: https://github.com/bee-san/pyWhat
    • noseyparker भी ठीक है: https://github.com/praetorian-inc/noseyparker
      मुझे लगता है कि ऐसे 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 कर सकता है?

    • security tool होने की वजह से शुरुआत से ही binary पर trust करना उद्देश्य के उलट है। source हो तो कम-से-कम यह inspect करने का विकल्प रहता है कि वह असल में क्या कर रहा है
    • Homebrew पर डालना चाहता था, लेकिन PR reject हो गया, इसलिए शायद मुझे अपना brew tap बनाना होगा या उन्हें accept करने के लिए मनाना होगा
      Docker image भी बनाने की योजना है
      सच कहूं तो मुझे उम्मीद नहीं थी कि यह इतना popular हो जाएगा, इसलिए repository अभी 100% तैयार स्थिति में नहीं है
    • Docker container अब उपलब्ध है और homepage पर documented है
  • 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 नहीं लगेगा