
ค้นหาและนับการใช้งาน unsafe ในแพ็คเกจ GO และการพึ่งพาของพวกเขา
go-geiger -v github.com/jlauinger/go-geiger

แพ็คเกจ GO สามารถหลีกเลี่ยงข้อ จำกัด ได้ตามปกติตั้งค่าการใช้งานตัวชี้โดยใช้ unsafe.Pointer สิ่งนี้มีค่าในการปรับปรุงประสิทธิภาพหรือแม้กระทั่งที่จำเป็นเช่นเพื่อโต้ตอบกับรหัส C หรือ syscalls
อย่างไรก็ตามนักพัฒนาต้องใช้ความระมัดระวังอย่างยิ่งกับ unsafe.Pointer เนื่องจากความผิดพลาดสามารถเกิดขึ้นได้อย่างรวดเร็วและพวกเขาสามารถแนะนำช่องโหว่ที่ร้ายแรงเช่นการใช้งานฟรีการใช้บัฟเฟอร์หรือบัฟเฟอร์ล้นบัฟเฟอร์
เนื่องจากการใช้งานของ unsafe.Pointer สามารถนำมาใช้ผ่านการพึ่งพา (และการพึ่งพาการพึ่งพา) จึงจำเป็นต้องตรวจสอบไม่เพียง แต่รหัสโครงการ แต่ยังรวมถึงการพึ่งพาหรืออย่างน้อยก็รู้ว่าใครต้องการความไว้วางใจ
go-geiger ช่วยให้นักพัฒนาสามารถระบุได้อย่างรวดเร็วว่าแพ็คเกจใดในแผนผังนำเข้าของแพ็คเกจ GO ใช้ unsafe.Pointer เพื่อให้นักพัฒนาสามารถมุ่งเน้นการตรวจสอบความพยายามเหล่านั้นหรือตัดสินใจเปลี่ยนไลบรารีสำหรับหนึ่งที่ไม่ได้ใช้ unsafe.Pointer
ในการติดตั้ง go-geiger ให้ใช้คำสั่งต่อไปนี้:
go get github.com/jlauinger/go-geiger
สิ่งนี้จะติดตั้ง go-geiger เป็น $GOPATH/bin ดังนั้นตรวจสอบให้แน่ใจว่ารวมอยู่ในตัวแปรสภาพแวดล้อม $PATH ของคุณ
เรียกใช้ Go-Geiger บนแพ็คเกจแบบนี้:
$ go-geiger example/cmd
หรือจัดหาหลายแพ็คเกจคั่นด้วยช่องว่าง:
$ go-geiger example/cmd example/util strings
ในการตรวจสอบแพ็คเกจในไดเรกทอรีปัจจุบันคุณสามารถเรียก go-geiger ได้โดยไม่ต้องพารามิเตอร์:
$ go-geiger
การจัดหา --help ธง-Help พิมพ์ข้อมูลการใช้งานสำหรับ go-geiger :
$ go-geiger --help
มีธงต่อไปนี้:
--filter-context string Count only lines of requested context type (all,variable,parameter,assignment,call,other). Default all (default "all")
--filter-match string Count only lines of requested match type (all,pointer,sizeof,offsetof,alignof,sliceheader,stringheader,uintptr). Default pointer (default "pointer")
-h, --help help for geiger
-q, --hide-stats Hide statistics table, print only code. --show-code needs to be set manually
--include-std Show / include Golang stdlib packages
-l, --link Print link to pkg.go.dev instead of package name
-d, --max-depth int Maximum transitive import depth (default 10)
--show-code Print the code lines with unsafe usage
--show-only-once Do not repeat packages, show them only once and abbreviate further imports (default true)
-v, --verbose Show usage counts by different usage types
โดยค่าเริ่มต้น go-geiger จะนับเฉพาะการใช้งาน unsafe.Pointer เท่านั้น uintptr การตั้ง reflect.StringHeader --filter-match reflect.SliceHeader หนึ่งใน sizeof , offsetof , alignof , sliceheader , stringheader , uintptr หรือ all คุณยังสามารถใช้ go-geiger เพื่อค้นหา USAGE ของ unsafe.Sizeof , unsafe.Offsetof , unsafe.Alignof
การใช้อาร์กิวเมนต์ --verbose คำพูดคุณสามารถสั่งให้ go-geiger แสดงการนับบุคคลสำหรับบริบทการใช้งานที่แตกต่างกันของความไม่ปลอดภัย go-geiger แยกความแตกต่างระหว่างสิ่งต่อไปนี้:
ตัวแปร
var x unsafe. Pointerพารามิเตอร์
func foo ( x unsafe. Pointer ) {}งานที่มอบหมาย
x := unsafe . Pointer ( & y )เรียก
x := unsafe . Pointer ( & y )
foo ( x )อื่น ๆ ซึ่งรวมถึงทุกสิ่งที่ไม่ตกอยู่ภายใต้สี่ครั้งแรก
ใช้ --filter-context เพื่อกรองการนับเป็นประเภทบริบทเฉพาะ คุณสามารถใช้ variable , parameter , assignment , call , other หรือ all
หากโครงการของคุณใช้โมดูล GO และไฟล์ go.mod go-geiger จะดึงข้อมูลการพึ่งพาทั้งหมดโดยอัตโนมัติก่อนที่จะวิเคราะห์ มันทำงานเหมือน go build จะ
หากคุณใช้รูปแบบที่แตกต่างกันของการจัดการการพึ่งพาเช่นคู่มือ go get , go mod vendor หรือสิ่งอื่นใดคุณต้องเรียกใช้การจัดการการพึ่งพาของคุณก่อนที่จะเรียกใช้ go-geiger เพื่อให้มีการพึ่งพาทั้งหมดก่อนการวิเคราะห์
go-geiger ได้รับแรงบันดาลใจจาก Cargo Geiger ซึ่งเป็นเครื่องมือที่คล้ายกันในการค้นหาบล็อกรหัสที่ไม่ปลอดภัยในโปรแกรมสนิมและการพึ่งพาของพวกเขา
Jlauinger/go-unsafepointer-poc มีการพิสูจน์แนวคิดสำหรับการใช้ประโยชน์จากช่องโหว่ที่เกิดจากการใช้งาน unsafe.Pointer ฉันยังเขียนชุดบล็อกโพสต์เกี่ยวกับปัญหาและช่องโหว่เฉพาะ
Go-Safer เป็นเครื่องมือ linter ที่สามารถช่วยในการระบุรูปแบบการใช้งานทั่วไปและอันตรายสองรูปแบบของ unsafe.Pointer
ในการรับซอร์สโค้ดและรวบรวมไบนารีให้เรียกใช้สิ่งนี้:
$ git clone https://github.com/jlauinger/go-geiger
$ cd go-geiger
$ go build
เรียกใช้การทดสอบด้วย go test
ได้รับใบอนุญาตภายใต้ใบอนุญาต MIT ("ใบอนุญาต") คุณไม่สามารถใช้โครงการนี้ยกเว้นตามใบอนุญาต คุณอาจได้รับสำเนาใบอนุญาตที่นี่
ลิขสิทธิ์ 2020 Johannes Lauinger
เครื่องมือนี้ได้รับการพัฒนาเป็นส่วนหนึ่งของวิทยานิพนธ์ปริญญาโทของฉันที่กลุ่มเทคโนโลยีซอฟต์แวร์ที่ TU Darmstadt