[Go] fuzzing

์ด์ „ ํฌ์ŠคํŠธ
https://blog.naver.com/sssang97/222692757243
fuzzing์€ ๋‚œ์ˆ˜ ๊ธฐ๋ฐ˜์˜ ๋ฌด์ž‘์œ„ ํ…Œ์ŠคํŠธ ๊ธฐ๋ฒ•์ด๋‹ค.
๊ทธ๋ƒฅ ๋žœ๋ค๊ฐ’์„ ์ž๋™์œผ๋กœ ์‘ค์…”๋„ฃ์–ด์„œ ์ž˜๋ชป๋œ ์—ฃ์ง€ ์ผ€์ด์Šค๊ฐ€ ์žˆ๋‚˜ ๊ฒ€์ฆํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

Go 1.18๋ถ€ํ„ฐ ๊ธฐ๋ณธ๊ธฐ๋Šฅ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ฐ€๋ น, ์ด๋Ÿฐ ๋‹จ์ˆœํ•œ ๋ง์…ˆ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ณด๊ฒ ๋‹ค.

์˜๋„์ ์œผ๋กœ lhs๊ฐ€ 10์ผ๋•Œ๋งŒ ์ž˜๋ชป๋œ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ๋กœ์ง์ด ์กด์žฌํ•œ๋‹ค.
์‹ค์ œ๋กœ ์ด๋Ÿฐ ๋ง๋„์•ˆ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์งค ๋ฆฌ๋Š” ์—†์ง€๋งŒ, ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“ ์ง€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์‚ฌ๋žŒ๋“ค์€ ์ด๋Ÿฐ๊ฑธ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณค ํ•œ๋‹ค.

ํšจ๊ณผ๋Š” ์žˆ์ง€๋งŒ, ๋‹จ์  ๋˜ํ•œ ๊ทน๋ช…ํ•˜๋‹ค.
๊ฒฐ๊ตญ ๋…ธ๊ฐ€๋‹ค๋กœ ์ผ€์ด์Šค ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๋‹ค ์น˜๊ฑฐ๋‚˜, ์˜ˆ์ƒ๋˜๋Š” ์—ฃ์ง€์ผ€์ด์Šค๋ฅผ ์ฐ์–ด์„œ ๋‹ค ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•˜๋Š”๋ฐ, ์‚ฌ๋žŒ์ด ๊ทธ๊ฑธ ๋‹ค ์ฒดํฌํ•˜๋Š”๊ฑด ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊น๊ฑฐ๋‚˜ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.





Fuzzing ํ…Œ์ŠคํŠธํ•˜๊ธฐ

์ด์ œ ๋‹ค์‹œ ํ•ด๋ณด์ž. ๊ธฐ์กด ํ…Œ์ŠคํŠธ์šฉ ์†Œ์ŠคํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ Fuzz๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๊ณ , ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…๋„ F์—ฌ์•ผ ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Fuzz ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ, ๊ฑฐ๊ธฐ ์•ˆ์—์„œ ์ง„์งœ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. 2๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ถ€ํ„ฐ๋Š” ๋Œ€์ถฉ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ทธ ํƒ€์ž…์— ๋งž๋Š” ๊ฐ’์„ ์•Œ์•„์„œ ๋„ฃ์–ด์ค€๋‹ค.

func FuzzTest2(f *testing.F) {
	f.Fuzz(func(t *testing.T, lhs int, rhs int) {
		a := Add(lhs, rhs)
		b := Add(rhs, lhs)

		if a != b {
			t.Errorf("lhs: %d, rhs: %d", lhs, rhs)
		}
	})

}

๋ง์…ˆ์— ์‚ฌ์šฉํ•  ์–‘๋ณ€ ๊ฐ’์„ ๋‹ค ์ •์ˆ˜๋กœ ๋ฐ›์•„์™€์„œ ๋Œ๋ฆฌ๊ฒŒ ํ–ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ตํ™˜๋ฒ•์น™์ด ์„ฑ๋ฆฝํ•˜๋Š”์ง€๋ฅผ ๊ฒ€์ฆํ•˜๊ฒŒ ํ–ˆ๋‹ค. ์ด๊ฑด ์ž…๋ ฅ๊ฐ’์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋Ÿฐ์‹์œผ๋กœ ์ข€ ์šฐํšŒ์  ๊ฒ€์ฆ์„ ํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ๋Œ๋ฆด๋•Œ fuzz ์˜ต์…˜์„ ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

go test -fuzz=Fuzz

๊ทธ๋Ÿผ ์•Œ์•„์„œ ๋‚œ์ˆ˜ ๋Œ๋ ค๋ณด๋‹ค๊ฐ€ ์˜ค๋ฅ˜ ์ผ€์ด์Šค๋ฅผ ์ฐพ์•„์ค„ ๊ฒƒ์ด๋‹ค.
๋”ฑ ๋งž์ถฐ์„œ ๋˜์ ธ์คฌ๋‹ค.



์ฐธ์กฐ
https://go.dev/doc/tutorial/fuzz