セキュリティに気を使っていますか?近年、徐々にセキュリティが意識されるようになり対策も進んできています。しかし、未だに大企業による情報流出事件が後をたちません。おそらく、報道されない中小企業や零細企業でのセキュリティ侵害も相当数に上っているでしょう。JNSAの調査によると、2015年の上半期だけでも約500万人もの個人情報が流出しています。流出原因の大部分は人的ミスによるものですが、セキュリティ対策をしていれば防げたものもあります。
一般的なシステムエンジニア(SE)の仕事は、システムを設計することです。もし、SEにまったくセキュリティの知識がなかったらどうなるでしょうか?おそらく、知らず知らずのうちに脆弱なシステムを設計してしまうでしょう。請負の案件であれば責任問題に発展してしまうかもしれません。セキュリティ対策は価値を生まないため、ないがしろにされがちですが、”損失を生まないため”には必要不可欠なことなのです。
この記事では、
- システムエンジニアとして働こうと思っている方
- システムエンジニアとして働いている方
のために、セキュリティの脆弱性(セキュリティホール)の種類と対策について説明していきます。セキュリティの世界に完璧はなく、どれだけ対策を行ったとしても100%攻撃から身を守ることは不可能です。しかし、それでも既知の脆弱性をみすみす攻撃されるようなことがあってはなりません。基本的なセキュリティ対策はしっかりと実施しておきましょう。
参照:JavascriptとJavaについて解説した記事はこちら
XSS
XSS(クロスサイトスクリプティング)は、悪意のあるスクリプト(JavaScript)を実行させられてしまう脆弱性です。この脆弱性を突かれると攻撃対象のサイトの情報を盗まれてしまいます。また、JavaScriptでできる任意の操作が可能です。
原因
ユーザーからの入力など安全でないデータをサイト上にそのまま出力していることが主な原因です。入力データのサニタイズ(無害化)が適切に実施されていない場合、攻撃者はスクリプトタグを挿入して実行することができます。それを利用して、悪意のあるスクリプトを含んだリンクをユーザーにクリックさせて攻撃対象のサイトで実行させるのです。
対策
外部からの入力のすべてをサニタイズする必要があります。たとえば、掲示板であればHTMLタグをすべて排除して単純なテキストのみ許可するといったことです。一部のみ許可する場合には、ブラックリスト方式ではなくホワイトリスト方式の方が望ましいでしょう。
強制ブラウジング
強制ブラウジングは、リンクされていないファイルに直接アクセスする攻撃方法です。公開するべきではないデータにアクセスされると、情報流出につながります。また、それを足がかりにサーバーに攻撃を仕掛けられる可能性もあります。
原因
アクセス制限に不備のある機密情報を含むファイルが存在する場合、リンクされていなくてもURLを推測してアクセスすることが可能です。有名ソフトウェアの既知のファイル名なら推測する必要すらありません。また、認証チェックが不十分だと、未認証の状態でも直接アクセスを許してしまいます。
対策
サーバー上のすべてのファイルについてアクセス制限を行う必要があります。不要なファイルはサーバー上から削除しましょう。また、直接アクセスした際にも認証がしっかりと行われることを確認しておきます。
SQLインジェクション
SQLインジェクションは、外部から悪意のあるSQLを実行させられてしまう脆弱性です。ウェブページの改ざんやデータベースの情報流出など重大な問題を引き起こします。クレジットカード情報が含まれていると二次被害が発生する可能性もあります。
原因
こちらもXSS同様、サニタイズが不十分なために起こります。外部からの入力を使ってSQL文を組み立てている場合、入力をそのまま使ってしまうとSQLインジェクションが発生します。検索クエリやユーザー認証クエリなどが攻撃されやすいポイントです。
対策
SQL文で使用されている入力データのすべてをサニタイズするようにします。ほとんどの言語にはSQLインジェクションを防ぐための方法が用意されています。自前で対策を行うよりも既存の仕組みを使ったほうが賢明でしょう。
パラメーターの改ざん
パラメーターの改ざんは、URLやCookie、hiddenフィールドなどのパラメーターを書き換えることで攻撃を仕掛ける方法です。パラメーターを改ざんすることで、不正なデータの挿入やユーザーのなりすましが可能になります。
原因
改ざん可能な方法で重要なデータを保持していることが原因です。また、ユーザーIDが連番などの推測可能な値になっていると攻撃を容易にしてしまいます。
対策
改ざんできないような方法(サーバーなど)でデータを管理するようにしましょう。また、どうしてもパラメーターとして保持する必要がある場合には、改ざん可能なことを考慮して改ざんされても問題ないように対策をしておきます。
OSコマンドインジェクション
OSコマンドインジェクションは、悪意のあるOSコマンドを実行させられてしまう脆弱性です。任意のOSコマンドが実行可能なため、システムの乗っ取りやウェブサイトの改ざんなど深刻な被害をもたらします。
原因
PHPやPerlなどの言語にはOSコマンドを実行できる関数があります。そういった関数にサニタイズされていない外部データ(ユーザー入力など)が含まれているとOSコマンドインジェクションが発生します。
対策
OSコマンドが実行可能な関数を使用しないことが最善の策です。どうしても使用する必要がある場合には、サニタイズを確実に行い不正なデータが挿入されないようにしましょう。
ディレクトリトラバーサル
ディレクトリトラバーサルは、任意のパス(ディレクトリ)を使用してファイルにアクセスする攻撃手法です。普通ならアクセスできないようなファイルにアクセスされ、情報の流出が起きます。また、設定情報が流出しサーバーの乗っ取りが行われる場合もあります。
原因
一部のアプリケーションでは、URLやフォームなど任意で入力可能な箇所からファイル名(パス)を取得する場合があります。アプリケーションの設計によっては、その値を任意のパスに書き換えることで、任意のファイルを表示することができてしまいます。これは、パスが適切にサニタイズされていないことが原因です。
対策
任意で入力可能な箇所から取得したファイル名(パス)を適切にサニタイズするようにします。ファイル名のみ必要な場合は、パスに含まれるディレクトリを除去しましょう。ディレクトリ情報まで必要なら、ホワイトリスト方式を使い、公開しても問題のないディレクトリのみに制限します。
エラーメッセージ
ユーザーに情報を提供するエラーメッセージが攻撃者に利用される場合もあります。攻撃者は、エラーメッセージを手がかりにシステムの内部動作を推測します。デバッグ表示が有効な状態ではソースコードの一部が表示されることもあり、攻撃者にとって非常に有益な情報源となってしまいます。
原因
ユーザーに詳細な情報を提供しようとして、不要な情報を表示してしまうことが一因です。一般的な状況としては、ログインエラー時のメッセージが挙げられます。エラーメッセージで「ユーザーが存在しない」「パスワードが間違っている」といった表示を行うと、ユーザーの存在が明らかになってしまい、総当たり攻撃を容易にしてしまいます。
対策
エラーメッセージは必要最低限のものとし、デバッグ情報を表示しないようにしましょう。多くのユーザーはエラーメッセージを見ても対処できないことが多く、結局はサポートに頼ることになります。必要以上にエラーメッセージを詳細化しないようにしましょう。
まとめ
この記事では、一般的な脆弱性を説明してきました。脆弱性の種類はこれ以外にもあり、技術の移り変わりによって新たな脆弱性が生まれ続けています。そのため、常に最新のセキュリティ情報に目を光らせておくべきです。IPAやトレンドマイクロ、ラックなどのセキュリティ企業が公開しているセキュリティ情報をチェックしましょう。セキュリティに興味がでてきたら、SEの次のキャリアとしてセキュリティエンジニアを目指すのもおすすめです。あなたはセキュリティ対策についてどのように思っていますか?
参照:JavascriptとJavaについて解説した記事はこちら
フリーランスになるために必要な知識やスキルアップの方法等、様々なお役立ち情報を発信していきます。
(リモートワーク案件に強いフリーランスエージェント「クラウドワークス テック」を運営)