2 पॉइंट द्वारा GN⁺ 2024-09-15 | 1 टिप्पणियां | WhatsApp पर शेयर करें

FlowTracker: Java प्रोग्रामों में डेटा फ्लो ट्रैकिंग

FlowTracker एक Java agent है, जो यह ट्रैक करता है कि कोई प्रोग्राम डेटा को कैसे पढ़ता, बदलता और लिखता है। इससे file और network I/O की जांच की जा सकती है, और input व output को जोड़कर यह दिखाया जा सकता है कि output कहाँ से आया। इसके जरिए Java प्रोग्राम के output का मतलब समझना आसान होता है।

डेमो

Spring PetClinic, Spring framework का एक demo application है। FlowTracker की क्षमताएँ दिखाने के लिए, इसमें यह देखा जाता है कि PetClinic कैसे HTTP requests को प्रोसेस करता है और templates व database से HTML pages बनाता है। आप browser में demo चला सकते हैं या वीडियो देख सकते हैं।

  • HTTP प्रोसेसिंग: FlowTracker दिखाता है कि किस code ने कौन-सा output बनाया। उदाहरण के लिए, यदि आप "HTTP/1.1" या HTTP header पर क्लिक करें, तो आप देख सकते हैं कि यह हिस्सा org.apache.coyote package की classes द्वारा बनाया गया है।
  • Thymeleaf templates: यह दिखाता है कि प्रोग्राम द्वारा पढ़ा गया input (HTML template) output से कैसे जुड़ता है। HTML tag name पर क्लिक करने से आप देख सकते हैं कि वह हिस्सा layout.html file से आया है।
  • Database: यह दिखाता है कि HTML page की table में मौजूद जानकारी database से आई है। उदाहरण के लिए, table में George पर क्लिक करने से आप देख सकते हैं कि वह value database से आई है।

यह demo in-memory database का उपयोग करता है, इसलिए SQL scripts तक भी ट्रैक किया जा सकता है। यदि MySQL database इस्तेमाल किया जाए, तो database connection तक भी ट्रैक किया जा सकता है।

उपयोग

FlowTracker अभी proof-of-concept चरण में है, इसलिए यह हर प्रोग्राम में ठीक से काम नहीं कर सकता। यह काफी overhead भी जोड़ता है, जिससे प्रोग्राम की execution धीमी हो जाती है। इसे इस्तेमाल करने के लिए FlowTracker agent jar file डाउनलोड करें और उसे Java command line में जोड़ें।

अंदरूनी काम करने का तरीका

संक्षिप्त विवरण

FlowTracker class files (bytecode) में code inject करके memory में मौजूद data और उसके source को ट्रैक करता है। यह मुख्य रूप से text और binary data (String, char और byte arrays) को ट्रैक करता है।

  • JDK method calls को FlowTracker के method calls से replace करता है।
  • JDK के महत्वपूर्ण स्थानों पर code inject करके input और output को ट्रैक करता है।
  • Method के अंदर local variables और stack की values को ट्रैक करने के लिए data flow analysis और गहरी instrumentation करता है।
  • Method call से पहले और बाद में, तथा method की शुरुआत और अंत में code जोड़कर method arguments और return values को ट्रैक करता है।

डेटा मॉडल: Tracker

FlowTracker के data model की मुख्य classes और concepts:

  • Tracker: ट्रैक किए जा रहे object की content और source की जानकारी रखता है।
    • content: वह content जिससे data गुज़रा है। उदाहरण: InputStream या OutputStream से गुज़रे सभी bytes।
    • source: content की range को दूसरे trackers की source range से जोड़ता है।
  • TrackerRepository: एक global map रखता है, जो दिलचस्प objects और उनके trackers को जोड़ता है।
  • TrackerPoint: tracker के भीतर उस स्थान को इंगित करता है जो एक single primitive value को दर्शाता है।

बेसिक instrumentation

Trackers को up-to-date रखने के लिए, कुछ खास JDK method calls पर FlowTracker के hook method calls डाले जाते हैं। उदाहरण के लिए, System.arraycopy call को com.coekie.flowtracker.hook.SystemHook.arraycopy call से replace किया जाता है।

Primitive values, data flow analysis

Primitive values को ट्रैक करना एक बड़ी चुनौती है। उदाहरण के लिए, byte value को ट्रैक करने के लिए method के भीतर local variables में trackers स्टोर किए जाते हैं।

Method calls

यह मॉडल करता है कि primitive values method calls के arguments और return values के रूप में दूसरे methods तक कैसे बहते हैं। Arguments और return values के PointTracker को स्टोर करने के लिए Invocation का उपयोग किया जाता है।

Source के रूप में code का उपयोग

यह उन values को ट्रैक करता है जो code से ही आती हैं, जैसे primitive और String constants। हर class के लिए एक tracker बनाया जाता है, और जब constants refer किए जाते हैं, तब उस tracker को refer किया जाता है।

String literals

String literals की नई copy बनाई जाती है, और String की content को ClassOriginTracker से जोड़ा जाता है। उदाहरण के लिए, String s = "abc"; को String s = StringHook.constantString("abc", 1234, 81); में rewrite किया जाता है।

Untracked values के लिए fallback तरीका

प्रोग्राम की हर value को ट्रैक नहीं किया जाता। जब कोई untracked value ऐसी जगह पहुँचती है जहाँ ट्रैकिंग ज़रूरी है, तो उसे constant की तरह treat किया जाता है।

GN⁺ का सार

  • FlowTracker, Java प्रोग्रामों के data flow को ट्रैक करके प्रोग्राम के output को समझने में मदद करता है।
  • Spring PetClinic demo के जरिए HTTP request processing, template उपयोग और database integration को विज़ुअली देखा जा सकता है।
  • यह अभी proof-of-concept चरण में है, इसलिए हर प्रोग्राम में अच्छी तरह काम नहीं कर सकता और performance overhead काफ़ी अधिक है।
  • Data flow analysis और method call tracking के जरिए primitive values और objects के source को ट्रैक किया जाता है।
  • मिलती-जुलती क्षमताओं वाले tools में Dynatrace, New Relic आदि शामिल हैं।

1 टिप्पणियां

 
GN⁺ 2024-09-15
Hacker News टिप्पणियाँ
  • Clojure के लिए FlowStorm नाम का एक टूल पेश किया गया

    • आधिकारिक Clojure compiler को fork करके अतिरिक्त bytecode डाला जाता है
    • ज़्यादातर values immutable होती हैं, इसलिए pointer बनाए रखकर snapshot लिया जा सकता है
    • web app debugging demo का लिंक दिया गया है: FlowStorm डेमो
  • Java/JVM ecosystem के टूल्स की बहुत प्रशंसा की गई

    • jitwatch जितना ही प्रभावशाली लगा
    • FlowTracker, taint analysis की याद दिलाता है
    • संबंधित keyword: "dynamic taint tracking/analysis"
    • संबंधित project लिंक:
  • HTML element से SQL statement तक trace करने वाला demo प्रभावशाली लगा

    • ऐसा टूल bug ठीक करने की पहली defense line बन सकता है
  • Smalltalk environment की याद दिलाता है

    • हर object और message को trace करके उनके साथ interact किया जा सकता है
  • demo video बहुत उपयोगी होने पर ज़ोर दिया गया

    • अनजान codebase को explore करते समय यह काम आ सकता है
  • HTML source maps जैसे concept पर प्रयोग करने का अनुभव साझा किया गया

    • web development tools को ऐसे full-stack गुणों से बड़ा फायदा मिलेगा
    • मौजूदा framework में इसे integrate करना बड़ी चुनौती है
    • संबंधित project लिंक: HTML Source Maps
  • Eve-lang demo से मिलती-जुलती चीज़ बताई गई

  • SQL injection को dynamic तरीके से खोजने वाले टूल जैसा एक paper याद होने की बात कही गई

  • इंटरनेट पर मौजूद data को trace करने का vision रखने का अनुभव साझा किया गया

    • यह image के source या string के path को trace करने की दिशा में बढ़ने वाला एक कदम है
  • VSCode और अपने project में इस टूल को आज़माने की कोशिश के लिए आभार जताया गया

    • फिलहाल यह रुका हुआ है, लेकिन दोबारा कोशिश करने की योजना है