Slide 1

Slide 1 text

gosecを試してみた話 @k2wanko

Slide 2

Slide 2 text

コキチーズ@k2wanko セキュリティエンジニア 脆弱性診断とか Bug Bounty運営をやっている。 TypeScriptとGoが好き。 最近Splatoonを復帰した。 ウデマエ 平均X2200くらい

Slide 3

Slide 3 text

gosecとは? by https://github.com/securego/gosec

Slide 4

Slide 4 text

Inspects source code for security problems by scanning the Go AST.

Slide 5

Slide 5 text

GoのASTをスキャンして、 ソースコードの セキュリティ上の問題を調べます。

Slide 6

Slide 6 text

もともとgasという名前だったのを gosecに名前を変えています。

Slide 7

Slide 7 text

Website https://securego.io

Slide 8

Slide 8 text

ライセンスは Apache License version 2

Slide 9

Slide 9 text

Install

Slide 10

Slide 10 text

GO111MODULE=off go get github.com/securego/gosec

Slide 11

Slide 11 text

Install curl -sfL https://raw.githubusercontent.com/securego/gosec/master/ins tall.sh | sh -s -- -b $GOPATH/bin 1.2.0

Slide 12

Slide 12 text

gosecの使い方

Slide 13

Slide 13 text

gosec ./...

Slide 14

Slide 14 text

gosec -include=G101,G102

Slide 15

Slide 15 text

gosec -exclude=G303 ./...

Slide 16

Slide 16 text

G101 Look for hardcoded credentials

Slide 17

Slide 17 text

G101 Look for hardcoded credentials ハードコードされた認証情報を検知してくれます。 ある程度複雑なクレデンシャルじゃないと検知してくれない。(configで調整) package main func main() { username := "admin" password := "iang9kiechihien4fieCh7beicienein" ... }

Slide 18

Slide 18 text

G101 Look for hardcoded credentials `(?i)passwd|pass|password|pwd|secret|token` このパターンにマッチする変数に代入されると検知。 configから設定を変えられる。 goesc -conf config.json . { “G101”: { “pattern”: “(?i)passwd|pass|password|pwd|secret|token|key” } }

Slide 19

Slide 19 text

G103: Use of unsafe block

Slide 20

Slide 20 text

G103: Use of unsafe block unsafeパッケージの"Alignof", "Offsetof", "Sizeof", "Pointer"の利用を検知します。 人類にメモリ管理は早すぎるのでunsafeパッケージを使うのは極力避けよう package main import ( “unsafe” ) func main() { addressHolder := uintptr(unsafe.Pointer(intPtr)) + unsafe.Sizeof(intArray[0]) intPtr = (*int)(unsafe.Pointer(addressHolder)) }

Slide 21

Slide 21 text

G201: SQL query construction using format string

Slide 22

Slide 22 text

G201: SQL query construction using format string SQLを文字列の結合で組み立てているのを検知してくれます。 import ( “database/sql” ... ) func main() { db, err := sql.Open("sqlite3", ":memory:") ... q := fmt.Sprintf("SELECT * FROM foo where name = '%s'", os.Args[1]) rows, err := db.Query(q)

Slide 23

Slide 23 text

G201: SQL query construction using format string 文字列の結合ではなく database/sqlパッケージを利用してSQLを組み立てましょう。 import ( “database/sql” ... ) func main() { db, err := sql.Open("sqlite3", ":memory:") ... rows, err := db.Query("SELECT * FROM foo where name = ?", name)

Slide 24

Slide 24 text

gosecで検知できる項目 misc G101 Look for hardcoded credentials G102 Bind to all interfaces G103 Audit the use of unsafe block G104 Audit errors not checked G105 Audit the use of big.Exp function5 G106 Audit the use of ssh.InsecureIgnoreHostKey function G107 Url provided to HTTP request as taint input injection G201 SQL query construction using format string G202 SQL query construction using string concatenation G203 Use of unescaped data in HTML templates G204 Audit use of command execution

Slide 25

Slide 25 text

gosecで検知できる項目 filesystem G301 Poor file permissions used when creating a directory G302 Poor file permissions used when creation file or using chmod G303 Creating tempfile using a predictable path G304 File path provided as taint input G305 File path traversal when extracting zip archive crypto G401 Detect the usage of DES, RC4, MD5 or SHA1 G402 Look for bad TLS connection settings G403 Ensure minimum RSA key length of 2048 bits G404 Insecure random number source (rand) blacklist G501 Import blacklist: crypto/md5 G502 Import blacklist: crypto/des G503 Import blacklist: crypto/rc4 G504 Import blacklist: net/http/cgi G505 Import blacklist: crypto/sha1

Slide 26

Slide 26 text

// #nosec G201 G202 G203 /* #nosec G401 */ とcommentつけることで エラーを無視できる。

Slide 27

Slide 27 text

まとめと所感

Slide 28

Slide 28 text

まとめと所感 - うっかりミスを発見するにはよい。 - CIに組み込むほどではないかも。 - 診断業務で簡易的に使うには便利そう。 - 勉強会に来る人にはあまり必要なさそう。 - 実際に仕事で使うならフォークしてルールを追加していく必要がある。

Slide 29

Slide 29 text

おわり