2 คะแนน โดย GN⁺ 2024-09-15 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

FlowTracker: ติดตามการไหลของข้อมูลในโปรแกรม Java

FlowTracker เป็น Java agent ที่ใช้ติดตามวิธีที่โปรแกรมอ่าน จัดการ และเขียนข้อมูล ทำให้สามารถตรวจสอบ file และ network I/O รวมถึงเชื่อมโยงอินพุตกับเอาต์พุตเพื่อแสดงให้เห็นว่าเอาต์พุตมาจากที่ใด ด้วยวิธีนี้จึงช่วยให้เข้าใจได้ว่าเอาต์พุตของโปรแกรม Java หมายถึงอะไร

เดโม

Spring PetClinic เป็นแอปพลิเคชันเดโมของเฟรมเวิร์ก Spring เพื่อสาธิตความสามารถของ FlowTracker จึงมีการสังเกตกระบวนการที่ PetClinic ประมวลผล HTTP request และสร้างหน้า HTML จากเทมเพลตและฐานข้อมูล สามารถรันเดโมในเบราว์เซอร์หรือรับชมวิดีโอได้

  • การประมวลผล HTTP: FlowTracker แสดงให้เห็นว่าโค้ดส่วนใดสร้างเอาต์พุตใดขึ้นมา ตัวอย่างเช่น เมื่อคลิกที่ "HTTP/1.1" หรือ HTTP header จะเห็นได้ว่าส่วนนี้ถูกสร้างโดยคลาสในแพ็กเกจ org.apache.coyote
  • เทมเพลต Thymeleaf: แสดงให้เห็นว่าอินพุตที่โปรแกรมอ่านเข้ามา (เทมเพลต HTML) เชื่อมโยงกับเอาต์พุตอย่างไร เมื่อคลิกชื่อแท็ก HTML จะเห็นได้ว่าส่วนนั้นมาจากไฟล์ layout.html
  • ฐานข้อมูล: แสดงให้เห็นว่าข้อมูลในตารางของหน้า HTML มาจากฐานข้อมูล ตัวอย่างเช่น เมื่อคลิก George ในตาราง จะเห็นได้ว่าค่านั้นมาจากฐานข้อมูล

เดโมนี้ใช้ฐานข้อมูลในหน่วยความจำ จึงสามารถติดตามย้อนกลับไปถึง SQL script ได้ หากใช้ฐานข้อมูล MySQL ก็จะสามารถติดตามไปถึงการเชื่อมต่อฐานข้อมูลได้

วิธีใช้งาน

ปัจจุบัน FlowTracker ยังอยู่ในขั้น proof of concept และอาจทำงานได้ไม่ดีในทุกโปรแกรม นอกจากนี้ยังเพิ่ม overhead จำนวนมาก ทำให้โปรแกรมทำงานช้าลง การใช้งานทำได้โดยดาวน์โหลดไฟล์ FlowTracker agent jar แล้วเพิ่มเข้าไปใน Java command line

การทำงานภายใน

คำอธิบายแบบย่อ

FlowTracker แทรกโค้ดเข้าไปใน class file (bytecode) เพื่อติดตามข้อมูลในหน่วยความจำและแหล่งที่มาของข้อมูลนั้น โดยหลักแล้วจะติดตามข้อมูลแบบข้อความและไบนารี (String, char และอาร์เรย์ byte)

  • แทนที่การเรียกเมธอดของ JDK ด้วยการเรียกเมธอดของ FlowTracker
  • แทรกโค้ดในตำแหน่งสำคัญของ JDK เพื่อติดตามอินพุตและเอาต์พุต
  • ทำ data flow analysis และ instrumentation ที่ลึกขึ้นเพื่อใช้ติดตามค่าของตัวแปรภายในและค่าบนสแต็กภายในเมธอด
  • เพิ่มโค้ดก่อนและหลังการเรียกเมธอด รวมถึงตอนเริ่มและจบเมธอด เพื่อติดตามอาร์กิวเมนต์ของเมธอดและค่าที่ส่งกลับ

โมเดลข้อมูล: Tracker

คลาสและแนวคิดหลักในโมเดลข้อมูลของ FlowTracker:

  • Tracker: เก็บข้อมูลเกี่ยวกับเนื้อหาและแหล่งที่มาของออบเจ็กต์ที่ติดตาม
    • content: เนื้อหาที่ข้อมูลได้ไหลผ่าน เช่น ไบต์ทั้งหมดที่ผ่าน InputStream หรือ OutputStream
    • source: เชื่อมโยงช่วงของเนื้อหาเข้ากับช่วงต้นทางของ tracker อื่น
  • TrackerRepository: เก็บ global map ที่เชื่อมโยงออบเจ็กต์ที่น่าสนใจกับ tracker ของมัน
  • TrackerPoint: ชี้ไปยังตำแหน่งใน tracker ที่แทนค่าพื้นฐานค่าเดียว

instrumentation พื้นฐาน

เพื่อให้ Trackers เป็นปัจจุบันอยู่เสมอ จะมีการแทรกการเรียกเมธอด hook ของ FlowTracker เมื่อมีการเรียกเมธอด JDK บางตัว ตัวอย่างเช่น การเรียก System.arraycopy จะถูกแทนที่ด้วยการเรียก com.coekie.flowtracker.hook.SystemHook.arraycopy

ค่าพื้นฐาน, data flow analysis

การติดตามค่าพื้นฐานเป็นความท้าทายที่มากกว่า ตัวอย่างเช่น ในการติดตามค่า byte จะมีการเก็บ tracker ไว้ในตัวแปรภายในเมธอด

การเรียกเมธอด

มีการสร้างโมเดลสำหรับกรณีที่ค่าพื้นฐานไหลไปยังเมธอดอื่นในรูปของอาร์กิวเมนต์และค่าที่ส่งกลับ โดยใช้ Invocation เพื่อเก็บ PointTracker ของอาร์กิวเมนต์และค่าที่ส่งกลับ

ใช้โค้ดเองเป็นแหล่งที่มา

ติดตามค่าที่มาจากตัวโค้ดเอง (เช่น ค่าคงที่แบบ primitive และ String) โดยสร้าง tracker สำหรับแต่ละคลาส และอ้างอิง tracker นั้นเมื่อมีการอ้างถึงค่าคงที่

String literal

คัดลอก String literal ใหม่ และเชื่อมโยงเนื้อหาของ String กับ ClassOriginTracker ตัวอย่างเช่น String s = "abc"; จะถูกเขียนใหม่เป็น String s = StringHook.constantString("abc", 1234, 81);

วิธีสำรองสำหรับค่าที่ไม่ได้ถูกติดตาม

ไม่ได้มีการติดตามทุกค่าในโปรแกรม หากค่าที่ไม่ได้ถูกติดตามไปถึงตำแหน่งที่ควรต้องติดตาม จะจัดการค่าดังกล่าวในลักษณะคล้ายกับค่าคงที่

สรุปโดย GN⁺

  • FlowTracker ติดตามการไหลของข้อมูลในโปรแกรม Java เพื่อช่วยให้เข้าใจเอาต์พุตของโปรแกรมได้ดีขึ้น
  • ผ่านเดโม Spring PetClinic สามารถดูภาพการประมวลผล HTTP request การใช้เทมเพลต และการเชื่อมต่อฐานข้อมูลได้อย่างเป็นภาพ
  • ขณะนี้ยังอยู่ในขั้น proof of concept จึงอาจทำงานได้ไม่ดีในทุกโปรแกรม และมี performance overhead สูง
  • ใช้ data flow analysis และการติดตามการเรียกเมธอดเพื่อติดตามที่มาของค่าพื้นฐานและออบเจ็กต์
  • เครื่องมือที่มีความสามารถคล้ายกันได้แก่ Dynatrace, New Relic เป็นต้น

1 ความคิดเห็น

 
GN⁺ 2024-09-15
ความคิดเห็นบน Hacker News
  • แนะนำเครื่องมือชื่อ FlowStorm สำหรับ Clojure

    • ฟอร์กคอมไพเลอร์ Clojure อย่างเป็นทางการเพื่อแทรกไบต์โค้ดเพิ่มเติม
    • เนื่องจากค่าส่วนใหญ่เป็น immutable จึงสามารถเก็บพอยน์เตอร์ไว้เพื่อทำ snapshot ได้
    • มีลิงก์เดโมการดีบักเว็บแอป: เดโม FlowStorm
  • ชื่นชมว่าเครื่องมือใน ecosystem ของ Java/JVM ยอดเยี่ยมมาก

    • ประทับใจในระดับใกล้เคียงกับ jitwatch
    • FlowTracker ชวนให้นึกถึงการวิเคราะห์ taint
    • คีย์เวิร์ดที่เกี่ยวข้อง: "dynamic taint tracking/analysis"
    • ลิงก์โปรเจกต์ที่เกี่ยวข้อง:
  • ประทับใจกับเดโมที่ติดตามจากองค์ประกอบ HTML ไปจนถึงคำสั่ง SQL

    • เครื่องมือแบบนี้อาจเป็นแนวป้องกันด่านแรกในการแก้บั๊กได้
  • ชวนให้นึกถึงสภาพแวดล้อม Smalltalk

    • สามารถติดตามและโต้ตอบกับทุกออบเจ็กต์และทุกเมสเสจได้
  • เน้นว่าวิดีโอเดโมมีประโยชน์มาก

    • น่าจะมีประโยชน์เมื่อสำรวจโค้ดเบสที่ไม่คุ้นเคย
  • แชร์ประสบการณ์ที่เคยทดลองแนวคิดคล้ายกับ HTML source map

    • เครื่องมือพัฒนาเว็บจะได้ประโยชน์มากจากคุณสมบัติแบบ full-stack ลักษณะนี้
    • ความท้าทายใหญ่คือการผสานเข้ากับเฟรมเวิร์กที่มีอยู่
    • ลิงก์โปรเจกต์ที่เกี่ยวข้อง: HTML Source Maps
  • กล่าวว่าคล้ายกับเดโมของ Eve-lang

    • เป็นการดีบักด้วยวิธีตั้งคำถามว่าทำไมองค์ประกอบ UI ถึงไม่มีอยู่
    • ลิงก์ที่เกี่ยวข้อง: เดโม Eve-lang, เว็บไซต์ Eve-lang
  • จำได้ว่าเคยมีงานวิจัยที่คล้ายกับเครื่องมือสำหรับค้นหา SQL injection แบบไดนามิก

  • แชร์ว่าตนเองเคยมีวิสัยทัศน์เรื่องการติดตามข้อมูลบนอินเทอร์เน็ต

    • นี่เป็นอีกขั้นไปสู่การติดตามที่มาของภาพหรือเส้นทางของสตริงได้
  • ขอบคุณที่พยายามใช้เครื่องมือนี้กับ VSCode และโปรเจกต์ของตน

    • ตอนนี้หยุดไว้ก่อน แต่มีแผนจะลองใหม่อีกครั้ง