開発者向けセキュリティ

From mediawiki.org
This page is a translated version of the page Security for developers and the translation is 96% complete.
WMF Tech Days 2012 のウィキメディア財団セキュリティ エンジニア Chris Steipp によるプレゼンテーション

MediaWiki 開発者として、あなたにはレビューと監査が簡単なスタイルで安全なコードを書く責任があります。 この記事では、セキュリティに関連する問題点と、MediaWiki 開発者がこれらのセキュリティ問題に対処するために使用する成功事例に焦点を当てています。 コーディング スタイルの問題点については、MediaWiki コーディング規約をお読みください。

あらゆる MediaWiki 開発者は、Web アプリケーション開発および PHP の経験のレベルに関係なく、この記事を注意深く読み、定期的にこの資料に精通する必要があります。 さらに、すべての開発者は、クロスサイト スクリプティング (XSS)クロスサイト リクエスト フォージェリ (CSRF)SQL インジェクション に関する記事を注意深く読む必要があります。記事には、これらの一般的な脆弱性のそれぞれの詳細な説明が記載されています。 開発者向けセキュリティ チェックリスト は一般的な開発タスクの便利なリファレンスを提供します。

なぜセキュリティが重要か

ウェブ アプリケーションのセキュリティは、ネットワーク世界における重要な問題です。 セキュリティ上の脆弱性を持つウェブサイト群は、マルウェア、スパム、フィッシングなどの不正なグローバル インフラストラクチャの重要な構成要素となっています。 Bot herder たちは、セキュリティの脆弱性があるウェブサイトを探し、それらを乗っ取るために脆弱性を利用します。 乗っ取られたウェブサイトは、ブラウザーの脆弱性を利用したり、ソーシャル エンジニアリングによってあからさまにマルウェア (ウイルス) を訪問者に配布します。 ダウンロードしたマルウェアは、クライアントのコンピューターを、銀行口座情報の窃盗、スパムの送信、サービス妨害の脅威によるウェブサイトからの金銭強奪を目的とした組織犯罪のグローバル ネットワークの構成要素である「ゾンビ」に変えてしまうのです。

証明可能なセキュリティ

自分自身が完璧であり、コードにセキュリティ上の脆弱性がないことを確信するだけでは不十分です。 誰でもミスをします。 すべての MediaWiki コア コードと多くの MediaWiki 拡張機能コードは、経験豊富な開発者によってセキュリティが確認されます。 これはいい慣行であり、奨励されるべきです。

レビュアーが簡単にセキュリティが確認できるように、コードを証明可能にセキュアに書いてください。 怪しげに見えるものの、注意深く検討するとセキュアであるようなコードは書かないでください。 そのようなコードは、レビュアーの不安を引き起こすだけです。

セキュリティ脆弱性と攻撃の概要

この文書は、以下の攻撃とセキュリティ リスクに強い焦点を当てています。 各 MediaWiki 開発者はこれらの問題に精通し、少なくともそれらについての通過レベルの理解を持っている必要があります。

クロスサイト スクリプティング (XSS)

MediaWiki で XSS 脆弱性を回避するための詳細情報は、クロス サイト スクリプティングの記事を読んでください。 クロスサイトスクリプティング (XSS) の脆弱性により、攻撃者は悪意のあるコードをウェブサイトに注入できます。 XSS の脆弱性は、ウェブ アプリケーションが外部ソース (GET データ、POST データ、RSS フィード、URL など)からのデータを適切にエスケープしていないことに起因します。 XSS を介して行われる攻撃の範囲は非常に多岐にわたり、害のないいたずらから認証済み利用者アカウントの乗っ取りまであります。

主な防御策: XSS 攻撃を回避するための基本原則は以下のとおりです:

  • 入力を検証する
  • 出力をエスケープする

検証はスキップできますが、エスケープはスキップできません。 すべてをエスケープしてください。 出力にできるだけ近い位置でエスケープするようにすることで、レビュアーが簡単にそれを確認できます。

出力エンコーディング (エスケープ) はコンテキストに依存することに注意してください。 したがって、出力コンテキストを意識し、適切に符号化してください (例: HTML エンティティ、URL、JavaScript など)。

OWASP Abridged XSS Prevention Cheat Sheet は、XSS の問題を軽減するための便利で最新のクイック リファレンス ガイドです。

JavaScript を書いている場合は、DOM ベースの XSS とそのコードでの防止方法を理解してください。

クロスサイト リクエスト フォージェリ (CSRF)

MediaWiki での CSRF の脆弱性を回避するための詳細な情報については、クロスサイト リクエスト フォージェリ の記事を読んでください。 クロス サイト リクエスト フォージェリ (CSRF または XSRF) 攻撃は、被害者のブラウザーにキャッシュされた認証資格情報 (Cookie またはキャッシュされた利用者名とパスワードなど) を使用して、悪意のある HTTP リクエストを承認するものです。 悪意のある HTTP リクエストは、さまざまな方法で送信できます。 認証資格情報をキャッシュした Web ブラウザーでリクエストが処理される限り、CSRF 攻撃が試みられる可能性があります。

主要な防御策: CSRF 攻撃から保護するための主要な防御機構は、HTML フォームに編集トークンを追加することです。

SQL インジェクション

SQL インジェクションを回避するための詳細な情報については、SQL injection の記事を読んでください。

SQL インジェクションは、データベース クエリで不十分に検証された入力が使用されることに依存しており、攻撃者がサーバー上で任意の SQL クエリを実行できる可能性があります。 攻撃者は、その後、非公開データを取得したり、データを破壊したり、その他の意図しない応答を引き起こしたりできます。 最悪の場合、注入されたコードがデータベース サーバー、システム ユーティリティ、オペレーティング システムの複数の脆弱性を悪用してシステム全体を完全に制御できます。

主要な防御策: SQL インジェクションに対する主要な防御策は、MediaWiki 組み込みのデータベース関数を使用することです。 直接の SQL クエリを使用することを避けてください。

serialize() / unserialize()

unserialize() は任意のコード実行につながることがあります。 これを防止するため、MediaWiki 開発者は新しいコードでは PHP のシリアル化の代わりに常に json を使用する必要があります。

主な防御策: PHP のネイティブなシリアル化の代わりに FormatJson::encode()FormatJson::decode() を使用します。

歴史的な注記

関連項目

下位ページ