hook secrets ชี้ว่าเป็นปัญหาเมื่อพบ ข้อมูลรับรองที่ฝังอยู่ในซอร์สโค้ด แทนที่จะอ่านจาก environment โดยดูจาก ที่มาของค่า (ค่า literal หรือการอ่านจาก environment) ไม่ได้ดูจากเนื้อหาของค่า จึงไม่ต้องมีแคตตาล็อก prefix ของผู้ให้บริการแบบครบถ้วน และแทบไม่เกิดผลบวกลวงเลย hook นี้คือเอนจินแบบ deterministic เบื้องหลัง ความรู้เฉพาะทาง secrets
signature รูปแบบของผู้ให้บริการ ข้อมูลรับรองใน connection string และค่า literal ที่กำหนดให้ identifier ซึ่งชื่อบ่งว่าเป็น secret ไม่ขึ้นกับภาษา: สตริงเดียวกันมีความหมายเหมือนกันในทุกไฟล์ ส่วนฮิวริสติกสองแบบที่ขึ้นกับไวยากรณ์ ได้แก่ การอ่าน environment ที่มีค่าเริ่มต้นแบบฮาร์ดโค้ด และ secret ที่ไหลเข้าสู่ log sink นั้น เข้าใจภาษา เอนจินจึงไม่มองหา console.log ของ JavaScript ในไฟล์ Rust และตรวจ os.getenv("X", "default") ของ Python แยกเป็นของภาษานั้นเอง
การรัน
npx lagune read secrets # scans the whole project
npx lagune read secrets --dir src # scans a directory
npx lagune read secrets --file config.ts # scans a single file
การสแกนพิมพ์ผลออกมาได้สูงสุดสองส่วน Hardcoded secrets found คือชุดข้อตรวจพบ (ค่าเริ่มต้นแบบฮาร์ดโค้ดของตัวแปร environment ที่ชื่อบ่งว่าเป็น secret ข้อมูลรับรองที่ฝังอยู่ใน connection string หรือค่าที่ตรงกับรูปแบบของผู้ให้บริการที่คัดสรรไว้) hook จึงจบการทำงานด้วย exit code ที่ไม่ใช่ศูนย์ ส่วน Secret handling to review manually คือชุดเบาะแส: ค่า literal ธรรมดาที่กำหนดให้ identifier ซึ่งชื่อบ่งว่าเป็น secret (ระบุที่มาได้ แต่บอกไม่ได้ว่าค่านั้นเป็น secret จริงหรือไม่) และค่าที่ชื่อบ่งว่าเป็น secret ซึ่งไหลเข้าสู่ log sink หรือ response sink การรันที่ไม่พบปัญหาจะพิมพ์ no hardcoded secrets found
ตัวเลือก CLI
| ตัวเลือก | ค่า | คำอธิบาย |
|---|---|---|
--dir | ไดเรกทอรี | จำกัดการสแกนไว้ที่ไดเรกทอรีเดียว ใช้ซ้ำได้และใช้ร่วมกับ --file ได้ |
--file | ไฟล์ | จำกัดการสแกนไว้ที่ไฟล์เดียว ใช้ซ้ำได้และใช้ร่วมกับ --dir ได้ |
หากไม่ระบุตัวเลือก hook จะสแกนทั้งโปรเจกต์
เลือกสิ่งที่จะสแกน
hook นี้ข้ามสิ่งที่ Git ละเว้นไว้ หากต้องการข้ามมากกว่านั้น หรือต้องการสแกนสิ่งที่ Git ละเว้นไว้ ให้กำหนดการตั้งค่าเฉพาะของ secrets เอง:
npx lagune write add --ignore test/fixtures --checker secrets
{
"checkers": {
"secrets": { "gitignore": false, "ignore": ["test/fixtures"] }
}
}
กำหนดค่า hook อธิบายการตั้งค่าทั้งหมด
ภาษาที่รองรับ
ข้อตรวจพบเรื่องค่าเริ่มต้นของ environment และเบาะแสเรื่อง log sink อ่านรูปแบบโค้ดที่ต่างกันในแต่ละภาษา จึงครอบคลุมเฉพาะภาษาด้านล่างและไม่แจ้งอะไรในภาษาอื่น ส่วนสัญญาณอีกสามแบบทำงานกับ ทุก ไฟล์
| สัญญาณ | ภาษา |
|---|---|
| ค่าเริ่มต้นของ environment | JavaScript/TypeScript, Python, Ruby, PHP, Kotlin, Java, Go (cmp.Or), Rust, C# |
| log sink หรือ response sink | JavaScript/TypeScript, Python, Ruby, PHP, Java, Kotlin, Go, Rust, C, C++, C# |
ไม่ใช่ การตรวจหารูปแบบของ secret เพื่อเตือนว่ามีการ commit secret เข้าไปเป็นงานมาตรฐานของเครื่องมือความปลอดภัยเชิงป้องกัน และเป็นการทำงานแบบเดียวกับที่ gitleaks, trufflehog และ GitHub push-protection ทำ hook นี้มาพร้อม signature สำหรับตรวจจับ (รูปแบบ ของโทเค็นที่เปิดเผยต่อสาธารณะ) ไม่เคยมี secret จริง และทำหน้าที่ตรวจสอบและอธิบาย ไม่ได้ลักลอบนำข้อมูลออก
คำถามที่พบบ่อย
hook นี้ดูจากที่มาของค่า ไม่ได้ดูจากเนื้อหาของค่า รูปแบบที่มีความมั่นใจสูง (โทเค็นของผู้ให้บริการ ค่าเริ่มต้นของ environment และ connection string) เป็นข้อตรวจพบที่ทำให้จบการทำงานด้วย exit code ที่ไม่ใช่ศูนย์ ค่า literal ธรรมดาที่กำหนดให้ identifier ซึ่งชื่อบ่งว่าเป็น secret เป็นเบาะแสให้ตรวจทานและยืนยัน ส่วน identifier เดียวกันที่อ่านค่าจาก process.env นั้น hook จะไม่ทำเครื่องหมายเลย
