
CVE-2021-2471 - MySQL Connector/J における XXE 脆弱性の PoC
Oracle MySQL の MySQL Connectors 製品の脆弱性(コンポーネント: Connector/J)。影響を受けるサポート対象バージョンは 8.0.26 およびそれ以前です。
この脆弱性の攻撃が成功すると、重要なデータへの不正アクセス、または MySQL Connectors がアクセス可能なすべてのデータへの完全なアクセスが可能になり、さらに MySQL Connectors のハングアップや頻繁に繰り返されるクラッシュ(完全なDOS)を引き起こす不正な能力が生じる可能性があります。
この脆弱性は、Alibaba Cloud Security Team の Xu Yuanzhen 氏と Alibaba の Hongkun Chen 氏によって発見されました。
この PoC は研究目的で提供されています。明示的な許可なくターゲットを攻撃するために使用しないでください。
この脆弱性に関するベンダーの開示と修正は、こちら で確認できます。
XXE 脆弱性は、悪意のある DTD エンティティを含む XML が MysqlSQLXML コンポーネントによって受信され、getSource() 関数が呼び出されたときにトリガーされます。
以下の mysql-connector-java-8.0.26.jar のコードに見られるように、DOMSource クラスが getSource() 関数の引数として指定されると、安全でない方法で DocumentBuilder を公開します。そのため、攻撃者がビルダーに渡される inputSource のコンテンツを制御できる場合、XXE を取得するために悪用される可能性があります:
public <T extends Source> T getSource(Class<T> clazz) throws SQLException {
try {
this.checkClosed();
this.checkWorkingWithResult();
InputSource reader;
if (clazz != null && !clazz.equals(SAXSource.class)) {
SQLException sqlEx;
if (clazz.equals(DOMSource.class)) {
try {
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
DocumentBuilder builder = builderFactory.newDocumentBuilder();
if (this.fromResultSet) {
inputSource = new InputSource(this.owningResultSet.getCharacterStream(this.columnIndexOfXml));
} else {
inputSource = new InputSource(new StringReader(this.stringRep));
}
return new DOMSource(builder.parse(inputSource));
悪意のある XXE を MysqlSQLXML に渡す方法は 2 つあります:
sqlxml.setString() を使用した PoC XXE
resultSet.getSQLXML() を使用した PoC XXE
脆弱な JAR のダウンロード
その他の XXE ペイロード