gosecを試してみた話 / try gosec

1b177b37d966f573b1df5d7218a5f560?s=47 k2wanko
March 01, 2019

gosecを試してみた話 / try gosec

1b177b37d966f573b1df5d7218a5f560?s=128

k2wanko

March 01, 2019
Tweet

Transcript

  1. gosecを試してみた話 @k2wanko

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

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

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

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

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

  7. Website https://securego.io

  8. ライセンスは Apache License version 2

  9. Install

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

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

    $GOPATH/bin 1.2.0
  12. gosecの使い方

  13. gosec ./...

  14. gosec -include=G101,G102

  15. gosec -exclude=G303 ./...

  16. G101 Look for hardcoded credentials

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

    main() { username := "admin" password := "iang9kiechihien4fieCh7beicienein" ... }
  18. 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” } }
  19. G103: Use of unsafe block

  20. 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)) }
  21. G201: SQL query construction using format string

  22. 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)
  23. 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)
  24. 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
  25. 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
  26. // #nosec G201 G202 G203 /* #nosec G401 */ とcommentつけることで

    エラーを無視できる。
  27. まとめと所感

  28. まとめと所感 - うっかりミスを発見するにはよい。 - CIに組み込むほどではないかも。 - 診断業務で簡易的に使うには便利そう。 - 勉強会に来る人にはあまり必要なさそう。 -

    実際に仕事で使うならフォークしてルールを追加していく必要がある。
  29. おわり