TechBlogSideCIのエンジニアによる技術ブログです。ルールを見ていこうの会Goあけましておめでとうございます。いう、Go言語用のセキュリティ検査ツールがあります。この記事では、そのツールに含まれるルールを洗い出してみました。記事のルールは2017/01/05現在のものになります。https://github.com/GoASTScanner/gas/tree/d4f9b88cbf6b9f190a2425120c9cecc466ec363bコードナンバーGASの各ルールにはG101の様なコードナンバーが付与されています。この番号にはそれぞれ以下のような意味があります。blacklistでは、このルールをひとつづつ見ていきましょう。https://github.com/GoASTScanner/gas/blob/d4f9b88cbf6b9f190a2425120c9cecc466ec363b/rules/hardcoded_credentials_test.goクレデンシャル情報をハードコードしてあるものを検出します。言ういずれかの名前の変数への代入がある場合に警告を出します。このパターンは設定で変更できる模様です(未検証)。https://github.com/GoASTScanner/gas/blob/d4f9b88cbf6b9f190a2425120c9cecc466ec363b/rules/bind_test.go全てのネットワークインターフェイスに対してバインドしているコードを検出します。"0.0.0.0:2000")と等価であり、この様に記述すると全てのネットワークインターフェイスからのアクセスを許容する様になります。これにより同じネットワークに繋がった他のPCからのアクセスを許すことになってしまうため、特に公衆無線LANなどに繋いでいる場合は開発中のアプリケーションに外部からアクセスされてしまうため危険です。"127.0.0.1")の様に明示的にローカルホストからのアクセスのみを許容する様に変更することで、これを防ぐことが可能です。変更が記憶に新しいかも知れません。関数の呼び出しを検出します。https://github.com/GoASTScanner/gas/blob/d4f9b88cbf6b9f190a2425120c9cecc466ec363b/rules/errors_test.goエラーチェックをしていないコードを検出します。https://github.com/GoASTScanner/gas/blob/d4f9b88cbf6b9f190a2425120c9cecc466ec363b/rules/sql_test.goSQLのクエリをfmt.Sprintfで組み立てているコードを検出します。positiveがあります。https://github.com/GoASTScanner/gas/blob/d4f9b88cbf6b9f190a2425120c9cecc466ec363b/rules/sql_test.goSQLのクエリを、文字列を連結することで組み立てているコードを検出します。positiveがあります。https://github.com/GoASTScanner/gas/blob/d4f9b88cbf6b9f190a2425120c9cecc466ec363b/rules/sql_test.goテンプレートでHTMLを組み立てる際、外部から渡ってきた値がエスケープされているかを検査します。https://github.com/GoASTScanner/gas/blob/d4f9b88cbf6b9f190a2425120c9cecc466ec363b/rules/subproc_test.go外部プロセスの実行を検査します。例exec.Command("ls")また、この検査にはconfidenceレベルが3段階あり、コマンド及び引数に、リテラルでない値が使用されているコマンドの実行パスが絶対パスでないその他の順で指摘の信頼度が高くなっています。https://github.com/GoASTScanner/gas/blob/d4f9b88cbf6b9f190a2425120c9cecc466ec363b/rules/fileperms_test.goディレクトリを作る際のパーミッションが余分でないかを検査します。権限が適切に付いているため問題とはしないデフォルトでは0700より大きい権限が付いていた際に問題を指摘します。OpenFile版です。G301との相違点として、指摘を出すしきい値のデフォルトが0600であることがあります。https://github.com/GoASTScanner/gas/blob/d4f9b88cbf6b9f190a2425120c9cecc466ec363b/rules/tempfiles_test.goテンポラリファイルを作る際に、os.Createを使用しているものを検出します。os.Create("/tmp/demo1")テンポラリファイルを作成する場合は、os.Createではなくioutil.Tempfileを使用するべきです。https://github.com/GoASTScanner/gas/blob/d4f9b88cbf6b9f190a2425120c9cecc466ec363b/rules/weakcrypto_test.go弱い暗号化アルゴリズムを使用しているコードを検出します。DESは脆弱なため、AESなどの使用を検討しましょう。https://github.com/GoASTScanner/gas/blob/d4f9b88cbf6b9f190a2425120c9cecc466ec363b/rules/tls_test.goセキュアではないTLSの設定をしているコードを検出します。true},}この他にもいくつかの検出項目があります。https://github.com/GoASTScanner/gas/blob/d4f9b88cbf6b9f190a2425120c9cecc466ec363b/rules/rsa_test.goRSA鍵の鍵長が2048bit未満である場合を検出します。https://github.com/GoASTScanner/gas/blob/d4f9b88cbf6b9f190a2425120c9cecc466ec363b/rules/rand_test.gomath/randの使用を検出します。https://golang.org/pkg/math/rand/と記載があるため、乱数にセキュアさを求める場合(WebアプリケーションのセッションIDなど)であれば、crypto/randを使用するよう修正すべきでしょう。https://github.com/GoASTScanner/gas/blob/d4f9b88cbf6b9f190a2425120c9cecc466ec363b/rules/blacklist_test.goそれぞれのパッケージが脆弱であるなどの理由で、これらのパッケージのインポートをしていないか検出をします。MD5の代わりにSHA2などを使用すべきでしょう)まとめ以上がgasが持っているルールになります。gasを使ってGoアプリケーションのセキュリティを担保してはいかがでしょうか。ように-excludeオプションで指定したルールのみを無効に出来るので、ぜひご活用下さい。EFSにcloneしたら遅かった話この記事で説明したGitの話には、私の誤解が含まれています。読むこんにちは、RuboCop大好き!Pockeです。RuboCopプラグイン開発入門こんにちは。SideCIでは対応ツールの...2016-05-20TerraformとPackerを使ったインフラ構築の効率化はじめまして。4月にアクトキャットにjoinしたwata727です。RSSはてなブログで読者になるスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。