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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  7. Website
    https://securego.io

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  11. gosecの使い方

    View full-size slide

  12. gosec -include=G101,G102

    View full-size slide

  13. gosec -exclude=G303 ./...

    View full-size slide

  14. G101 Look for hardcoded credentials

    View full-size slide

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

    View full-size slide

  16. 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 full-size slide

  17. G103: Use of unsafe block

    View full-size slide

  18. 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 full-size slide

  19. G201: SQL query construction using
    format string

    View full-size slide

  20. 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 full-size slide

  21. 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 full-size slide

  22. 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 full-size slide

  23. 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 full-size slide

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

    View full-size slide

  25. まとめと所感

    View full-size slide

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

    View full-size slide