Upgrade to Pro — share decks privately, control downloads, hide ads and more …

gosecを試してみた話 / try gosec

k2wanko
March 01, 2019

gosecを試してみた話 / try gosec

k2wanko

March 01, 2019
Tweet

More Decks by k2wanko

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. Website
    https://securego.io

    View Slide

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

    View Slide

  9. Install

    View Slide

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

    View Slide

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

    View Slide

  12. gosecの使い方

    View Slide

  13. gosec ./...

    View Slide

  14. gosec -include=G101,G102

    View Slide

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

    View Slide

  16. G101 Look for hardcoded credentials

    View Slide

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

    View Slide

  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”
    }
    }

    View Slide

  19. G103: Use of unsafe block

    View Slide

  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))
    }

    View Slide

  21. G201: SQL query construction using
    format string

    View Slide

  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)

    View Slide

  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)

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  27. まとめと所感

    View Slide

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

    View Slide

  29. おわり

    View Slide