Skip to main content

Snyk Codeで安全なコーディングを実現:ひと工夫加えた無視機能

著者

Frank Fischer

Blog Design Snyk Code

2021年3月30日

0 分で読めます

セキュアコーディングツールでコードをスキャンすると、Snyk Codeがさまざまなセキュリティ脆弱性を検出することがあります。Snyk Codeは高速かつ高精度で、豊富な情報を提供しますが、特定の警告を抑制したい場合もあります。よくある例はテストコードです。ルーチンをテストするために意図的にハードコードされたパスワードを使う場合や、問題を把握していても修正しないと判断する場合などです。こうした状況に対応するため、Snyk CodeをはじめとするSnykプラットフォームの各製品では、提案を無視できます。

無視機能には、思っている以上にいろいろな側面があります(少なくとも、私が思っていた以上に)。まず、問題を無視する方法を見てから、この機能の実装について詳しく見ていきましょう。

Snyk Codeで無視機能を使う方法

Snyk CodeのWeb UIには、Ignoreという新しいボタンがあります(右下にあり、取り消し線の付いた目のアイコンが表示されています)。

脆弱なJavaScriptコード、サニタイズされていないHTTP入力の説明、「無視」と「詳細」ボタンを示す、Snyk CodeのSQLインジェクション検出結果。

このボタンから、静的アプリケーションセキュリティテスト(SAST)エンジンを設定できます。仕組みについては後ほど説明します。まずは使い方を見ていきましょう。

脆弱性ではないとして問題をマークするSnyk Codeのダイアログ。コメント欄、無視する期間の選択肢、[保存]ボタンが表示されています

Ignoreをクリックすると、上に示したオーバーレイが表示されます。まず、問題を脆弱性ではないとしてマークするのか、一時的に無視するのか(メッセージをいったん抑制したい場合)、それとも永続的に無視するのか(修正しない)を選びます。次に、自分や同僚に向けたコメントを記入できます(簡単な説明を残すことを強くおすすめします。コメントがないと、先週の判断が謎めいて見えることもあるからです)。最後に、問題を無視する期間を設定できます(14日、30日、60日、90日、または無期限)。

問題を無視するように設定すると、デフォルトでは表示されなくなります。左側のステータスセレクターで、無視した問題を表示し、無視の設定を解除または編集できます。この機能の詳細は、Snyk Codeの無視機能に関するドキュメントをご覧ください。

提案の無視は、見た目ほど単純ではありません

何かを無視対象としてマークする(または問題レポートに含めない)には、問題を安定して特定できなければなりません。再スキャンのたびに、エンジンが同じ問題を検出し、再びフラグを付ける必要があります。コードは常に変化し、行番号も変わるため、ファイル名と行番号を記憶するだけでは対応できません。従来のリンターでは、問題の隣にコメントを追加し、無視するようシステムに指示する方法が使われています。私たちも当初はこの方法を採用していました。しかし、静的コード解析を設定するためにコードへコメントを散りばめたくない、という開発者からの意見が寄せられました。そこで、独自の、そして私たちがより優れていると考える方法を考案しました。

従来のシステムでは、問題が発生したソースコード(およびその前後数行)からハッシュ値を計算し、それを問題の識別子として使います。テキストを変更すると問題IDも変わり、その問題に設定されたすべてのフラグが削除されます。しかし、人間の考え方は少し異なります。問題の隣にコメントを追加しても、実際には問題そのものを変更したわけではありません。それでもハッシュ値は変わり、問題は新しいものとして扱われます。

この問題を解決するために、他の多くのツールではレポートの数行だけを照合します。その結果、似た署名を持つ別の問題が再び検出されたときに、類似したレポートまで無視してしまうことがあります(過剰な無視)。反対に、無関係なコードが変更されただけで照合できなくなり、レポートが大量に出ることもあります。適切な仕組みを実現するため、一部のツールではレポートの照合方法に関する例外を何十個も集めたリストを使っています。しかし、どちらの方法にも欠点があります。実際の結果を出したアナライザーのことを考慮せず、テキストのレベルだけで処理しているからです。文の意味を理解しようとせず、単語を文字の並びとして扱うようなものです。

Snyk CodeのIgnore機能の仕組み

静的コード解析では、入力されたコードを中間表現と呼ばれる形式に変換します。これはコードのデータフローや制御フローを捉えながら、一部の詳細を抽象化したデータ構造です。この表現を使ってハッシュ値を生成するのが、私たちのアプローチです。そのため、コードをリファクタリングしたり変数名を変更したりしても、同じ問題を認識できます。さらに、完全一致の条件を緩和したことで、無視対象の問題を含むコードに小さな変更を加えても、無関係なレポートが再び表示されることはほとんどありません。

意味レベルで照合することで、人間の開発者と同じように、以前と同じ問題を認識できます。また、ソースコードにコメントを残す必要もありません。たとえば、次の2つのコードスニペットはテキスト上は異なりますが、変数名を変更しただけなので、同じ問題を示しています。

var fs = require('fs');

var logFileName = req.query.file || 'standard_log.log';
var logfile = fs.readFile(logFileName, "utf8", function(err, data) {...

var filesystem = require('fs');

var generalLogFileName = req.query.file || 'standard_log.log'; 
var handleLogFile = filesystem.readFile(generalLogFileName, "utf8", function(err, data) {...

フィードバックを無視しません

この新しい無視機能が、皆さまのお役に立てば幸いです。これは、ユーザーの皆さまからいただいた貴重なフィードバックを製品に反映した一例にすぎません。新しい無視機能についてのご感想や、今後の製品改善に向けたご提案を、ぜひお聞かせください。皆さまからのフィードバックをお待ちしています。

最先端のインテリジェンスでコードを保護

わずか30分で、Snyk CodeのSAST機能を幅広くご紹介します。