セキュアコーディングと規約
悪意ある第三者による攻撃で、大きな損失が出る事例が後を絶ちません。そこで大切なのが、セキュアコーディングです。ここでは、セキュアコーディングや規約について、特徴とできることを解説します。
セキュアコーディングとは
ソフトウェアを作るときに、サイバー攻撃に耐えられるコードを書くことを『セキュアコーディング』といいます。コードを書くときの設計ミスは、脆弱性の原因の一つといわれているのです。
こうした脆弱性を狙う攻撃は、1980年代から行われるようになりました。
それまでのセキュリティ対策では「ネットワークから分離すればよい」という考えが主流でしたが、実際に攻撃が起こったことで、プログラムそのものの対策が重要と考えられるようになったのです。
また、クラウドサービスなどの台頭によってネットワークがシステムの深部にまで関わっている現状では、ネットワークとシステムを切り離すのは困難な企業も多いでしょう。
そこで、プログラムのセキュリティ対策として、脆弱性を作り込まないコードの書き方が注目されるようになり、セキュアコーディングの考え方も広まっていきました。
コーディング規約とは
コードを書くときのルールを『コーディング規約』といいます。
あるシステムを作るとき、コードの書き方はさまざまです。そのため、複数のエンジニアが関わるプロジェクトでは、書き方が統一されないことがあります。
ばらばらの書き方になっているコードは、後から見返したときに読みにくいですし、脆弱性が生まれる危険性もあります。そこで、規約を設けて、コードの書き方を細かく指定するのです。
例えば、関数やメソッドの命名の仕方・行頭の空白やかっこの使い方・禁止事項などについて設定されています。
コーディング規約の目的
規約はコードの統一性に役立ちますが、それにより脆弱性を排除することにもつながります。
バグの原因になる複雑なコードを制限できるからです。バグの中には、脆弱性につながるものもあります。そのため、規約に従って複雑なコードを避けることが、セキュアコーディングにつながるのです。
また、後からメンテナンスや新バージョンに携わるエンジニアに分かりやすいコードになっていることも、セキュリティ対策として重要なポイントといえます。
読みにくいコードを読み解くのには時間がかかりますし、複雑さによって新たなバグが発生する可能性もあります。そのため、ルールにのっとったコードの作成が重要なのです。
セキュアコーディング規約の例
セキュリティ対策を重視したコーディング規約を『セキュアコーディング規約』といいます。中でも代表的な規約を紹介するので、セキュアコーディングをする際の参考にしましょう。
CERT C コーディングスタンダード
C言語でセキュリティ対策をしたコードを書くためのルールを定めているのが『CERT C コーディングスタンダード』です。
脆弱性につながる恐れのあるコードや、見慣れないコード・トリッキーなコードを減らすのに役立ちます。ルールに沿ってコードを書けば、質が高く攻撃にも強いプログラム作りができるのです。
また、一定のルールがあることで、バグにつながる複雑すぎるコードを書かないことにもつながります。
Java コーディングスタンダード CERT/Oracle 版
もともとセキュリティ対策に優れた言語であるJavaには、何重ものチェック機能が備わっています。配列や文字列の境界が自動的にチェックされたり、セキュリティ機構が備わっていたりするのです。
しかし、それでも弱みを見つけられ、攻撃をしかけられることがあります。
そうした攻撃に対して、できる限り守りを固めるためのコードを書くルールが『Java コーディングスタンダード CERT/Oracle 版』です。Oracle社によって制作されたコードで、エンジニアにとって使いやすく整理されています。
ただし、定められているルールは、Javaで書かれたコード全てに適用されるわけではありません。ソフトウェアの運用方法によって、適用の可否が決まることに注意しましょう。
Java コーディングスタンダード CERT/Oracle 版
チェックツールや検証の活用
セキュリティ対策のために、コーディング規約に準拠してコードを書いたとしても、誤ったコードを書いてしまうことがあります。そのため、必ず書き上げたコードは見直しをしましょう。
ただし、目視でのチェックは細部まで見たつもりでも漏れがあるものです。そこで、チェックツールや検証を活用するとよいでしょう。便利なツールや検証の特徴を解説します。
ツールでできること
目視でチェックするとたくさんの時間がかかりますが、チェックツールを使えば、スピーディーに終わらせられます。しかも、抜け漏れが発生することもありません。
単にコードの誤りを指摘するだけにとどまらず、脆弱性とその原因・対策を示してくれるツールもあります。
フロー解析とコーディング規約をチェックする機能を利用し、脆弱性が判明しているコードを検出できるのです。
具体的に検出できる項目には、例えば下記もあります。
- クロス サイト スクリプティング (XSS)
- インジェクションの欠陥
- 悪意のあるファイル実行
- 危険性のあるアルゴリズムによる暗号化
- 情報漏洩
- 不適切なエラー処理
- アクセス制限の不備
参考:Secure Coding Checker | ソリューション | ソニーデジタルネットワークアプリケーションズ株式会社
ファジングによる検証
セキュリティテストの一つに『ファジング』があります。バグや未知の脆弱性を検出するために行うテストです。問題が起こりそうなデータを用意して、検査対象の動作をテストします。
このとき、ファジングツールを利用すると、検査をスピーディーに実施可能です。
脆弱性を見つけるには、高度な知識と技術力が欠かせません。しかしファジングなら、特別高度な知識や技術を持っていなくても、脆弱性を見つけやすいのです。
そのため、大手企業の一部でも、リリース前の脆弱性検出にファジングを活用しているケースがあります。
まとめ
サイバー攻撃に耐えるプログラム作りをするには、セキュアコーディングを意識しましょう。脆弱性をできる限り排除するコードの書き方で、プログラムを強固に守ります。
その際、セキュアコーディング規約を参考にするとよいでしょう。どのようなルールでコードを書けば脆弱性が取り除かれるのか分かります。
また、チェックツールやファジングによるコードのチェックも欠かせません。紹介した規約やツールを参考に、セキュリティに配慮したコードを作成しましょう。