CS.XXE.DOCUMENT
XML 外部エンティティ (XXE) 攻撃の可能性
CS.XXE.DOCUMENT チェッカーは、脆弱に構成された XmlDocument パーサーによって処理される XML 入力のインスタンスにフラグを立てます。
脆弱性とリスク
XML 外部エンティティ攻撃は、XML 入力を解析するアプリケーションに対する一種の攻撃です。この攻撃は、外部エンティティへの参照を含む XML 入力が、脆弱に構成された XML パーサーによって処理されるときに発生します。この攻撃により、機密データの開示、サービスの拒否、サーバー側のリクエスト偽造、パーサーが配置されているマシンの視点からのポートスキャンなどの、システムへの影響が発生する可能性があります。
軽減と防止
XXE 攻撃を防ぐ最も安全な方法は、DTD (外部エンティティ) を完全に無効にすることです。パーサーによっては、メソッドが異なる場合があります。たとえば、.NET 4.5.2+ では、XDocument は DTD をデフォルトで無効にしており、デフォルトまたは安全でない設定で null 以外の XmlResolver を使用する場合にのみ、安全でなくなる可能性があります。
脆弱コード例
コピー
static void LoadXML()
{
string xxePayload = "<!DOCTYPE doc [<!ENTITY win SYSTEM 'file:///C:/Users/testdata2.txt'>]>"
+ "<doc>&win;</doc>";
string xml = "<?xml version='1.0' ?>" + xxePayload;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = new XmlUrlResolver(); // Defect reported here.XmlUrlResolver で構成された XmlResolver は安全ではありません。
xmlDoc.LoadXml(xml);
Console.WriteLine(xmlDoc.InnerText);
Console.ReadLine();
}
修正コード例
コピー
static void LoadXML()
{
string xxePayload = "<!DOCTYPE doc [<!ENTITY win SYSTEM 'file:///C:/Users/testdata2.txt'>]>"
+ "<doc>&win;</doc>";
string xml = "<?xml version='1.0' ?>" + xxePayload;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = null; // Setting the XmlResolver to null, or not setting it at all
// (it is null by default), disables DTDs.これは、XXE 攻撃を防止するのに役立つはずです。
xmlDoc.LoadXml(xml);
Console.WriteLine(xmlDoc.InnerText);
Console.ReadLine();
}
関連チェッカー
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。