@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/libxml2-xmlbuildqname-cve-2025-6021/#article>
    schema:about <https://comcomponent.com/knowledge/cve-2025-6021/>, <https://comcomponent.com/knowledge/xmlbuildqname/>, <https://comcomponent.com/knowledge/integer-overflow/> ;
    schema:mentions <https://comcomponent.com/knowledge/libxml2/>, <https://comcomponent.com/knowledge/buffer-overrun/>, <https://comcomponent.com/knowledge/denial-of-service/>, <https://comcomponent.com/knowledge/addresssanitizer/>, <https://comcomponent.com/knowledge/gnatprove/>, <https://comcomponent.com/knowledge/spark/>, <https://comcomponent.com/knowledge/libxml3/>, <https://comcomponent.com/knowledge/ada/> .

<https://comcomponent.com/knowledge/cve-2025-6021/> a skos:Concept ;
    skos:prefLabel "CVE-2025-6021"@ja ;
    skos:definition "2025年6月に公開されたlibxml2の脆弱性。xmlBuildQNameで接頭辞とローカル名から求めた必要なバイト数がintの上限を超えると容量の検査が働かず、呼び出し側のバッファの範囲外へ書き込む。libxml2 2.14.4と2.13.9で修正された。"@ja ;
    ks:requires <https://comcomponent.com/knowledge/xmlbuildqname/> ;
    ks:mayCause <https://comcomponent.com/knowledge/buffer-overrun/> ;
    ks:mayCause <https://comcomponent.com/knowledge/denial-of-service/> .

<https://comcomponent.com/knowledge/xmlbuildqname/> a skos:Concept ;
    skos:prefLabel "xmlBuildQName"@ja ;
    skos:definition "接頭辞とローカル名からprefix:nameの形の名前(QName)を組み立てる、libxml2のAPIの関数。呼び出し側が渡したバッファに収まればそこへ書き、収まらなければ新しい領域を確保する。"@ja .

<https://comcomponent.com/knowledge/integer-overflow/> a skos:Concept ;
    skos:prefLabel "整数オーバーフロー"@ja ;
    skos:definition "整数の演算結果が、その型で表せる範囲を超えること。言語と設定によって、例外・パニック・折り返しのいずれかになる。Adaでは、値が型の基本範囲に収まるかを確かめるOverflow_Checkに失敗すると、実行時にConstraint_Errorが送出される。"@ja ;
    skos:altLabel "Integer Overflow" ;
    skos:altLabel "integer overflow" ;
    skos:altLabel "算術オーバーフロー"@ja ;
    skos:altLabel "Overflow_Check" ;
    ks:verifiedBy <https://comcomponent.com/knowledge/gnatprove/> .

<https://comcomponent.com/knowledge/libxml2/> a skos:Concept ;
    skos:prefLabel "libxml2"@ja ;
    skos:definition "GNOMEプロジェクトのために開発が始まった、Cで実装されたXMLのツールキット。XMLのパーサーとツリーを扱うAPIを提供する。"@ja ;
    ks:implements <https://comcomponent.com/knowledge/xmlbuildqname/> .

<https://comcomponent.com/knowledge/buffer-overrun/> a skos:Concept ;
    skos:prefLabel "バッファオーバーラン"@ja ;
    skos:definition "配列やバッファの範囲外への書き込み・読み込みが起こる現象。C/C++で長年セキュリティ脆弱性の主要原因とされてきた。"@ja ;
    skos:altLabel "buffer overrun" ;
    skos:altLabel "buffer overflow" ;
    ks:verifiedBy <https://comcomponent.com/knowledge/addresssanitizer/> .

<https://comcomponent.com/knowledge/denial-of-service/> a skos:Concept ;
    skos:prefLabel "サービス妨害(DoS)"@ja ;
    skos:definition "対象のシステムを停止させたり応答不能にしたりして、正規の利用を妨げる攻撃。"@ja .

<https://comcomponent.com/knowledge/addresssanitizer/> a skos:Concept ;
    skos:prefLabel "AddressSanitizer"@ja ;
    skos:definition "範囲外へのアクセスや解放後の使用といったメモリの誤りを、メモリへのアクセスに検査を埋め込んで実行時に検出する、GCCとClangの機能。"@ja ;
    skos:altLabel "ASan" ;
    skos:altLabel "-fsanitize=address" .

<https://comcomponent.com/knowledge/gnatprove/> a skos:Concept ;
    skos:prefLabel "GNATprove"@ja ;
    skos:definition "AdaCoreが提供する、SPARKコードの契約や表明を自動証明器で検証するコマンドラインツールである。"@ja ;
    skos:altLabel "gnatprove コマンド"@ja ;
    skos:broader <https://comcomponent.com/knowledge/spark/> .

<https://comcomponent.com/knowledge/ada/> a skos:Concept ;
    skos:prefLabel "Ada(プログラミング言語)"@ja ;
    skos:definition "1970年代後半にアメリカ国防総省の主導で標準化された、強い型付けと高信頼性を重視する汎用プログラミング言語。最新標準はAda 2022。"@ja ;
    skos:altLabel "Ada言語"@ja ;
    skos:altLabel "Ada 2022" .

<https://comcomponent.com/knowledge/libxml3/> a skos:Concept ;
    skos:prefLabel "libxml3"@ja ;
    skos:definition "Ada/SPARKで書いたXMLの処理と、libxml2に似たCのAPIの一部を提供する、小村ソフトの実験的なプロジェクト。libxml2.so.2と同じABIや完全な互換性は提供しない。"@ja ;
    ks:uses <https://comcomponent.com/knowledge/spark/> .

<https://comcomponent.com/knowledge/spark/> a skos:Concept ;
    skos:prefLabel "SPARK"@ja ;
    skos:definition "プログラムの性質を数学的に証明できるように設計された、Adaのサブセット(部分言語)とそのツール群。"@ja ;
    skos:altLabel "SPARK Ada" ;
    skos:altLabel "GNATprove" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/libxml2/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/xmlbuildqname/> ;
    schema:description "xmlBuildQNameはlibxml2のtree.cにある関数で、接頭辞とローカル名からprefix:nameの形の名前を組み立てる。"@ja ;
    ks:evidence <https://gitlab.gnome.org/GNOME/libxml2/-/blob/v2.14.3/tree.c#L154-198> ;
    ks:verifiedAt "2026-11-13" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cve-2025-6021/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/xmlbuildqname/> ;
    schema:description "呼び出し側のバッファの外へ書き込むには、NULLではない接頭辞とローカル名、書き込み先のバッファを渡してxmlBuildQNameが呼ばれ、2つの長さの合計が2,147,483,646バイト以上であることが必要。合計の値はこの記事で修正前のコードから導いた。libxml2のパーサーは名前の長さを制限しているので、保守担当者はパーサーは影響を受けないはずだと述べている。記事の実測では、ツリーを作るAPIで作った要素を検証の関数の1つ（xmlValidNormalizeAttributeValue）に渡した場合にも、libxml2 2.14.3で同じ大きさの範囲外への書き込みが検出された。"@ja ;
    ks:evidence <https://gitlab.gnome.org/GNOME/libxml2/-/issues/926>, <https://gitlab.gnome.org/GNOME/libxml2/-/blob/v2.14.3/tree.c#L154-198>, <https://gitlab.gnome.org/GNOME/libxml2/-/blob/v2.14.3/include/libxml/parserInternals.h#L40-59>, <https://gitlab.gnome.org/GNOME/libxml2/-/blob/v2.14.3/valid.c#L3935-3938> ;
    ks:verifiedAt "2026-11-13" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/integer-overflow/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/buffer-overrun/> ;
    schema:description "修正前のxmlBuildQNameは必要なバイト数をintで計算していた。必要なバイト数がintの上限を超えると容量の検査が偽になり、足りないバッファが書き込み先に選ばれて、その外へ書き込む。修正は長さをsize_tで持ち、足す前に結果が型に収まることを確かめる。"@ja ;
    ks:evidence <https://gitlab.gnome.org/GNOME/libxml2/-/issues/926>, <https://gitlab.gnome.org/GNOME/libxml2/-/commit/ad346c9a249c4b380bf73c460ad3e81135c5d781> ;
    ks:verifiedAt "2026-11-13" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cve-2025-6021/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/buffer-overrun/> ;
    schema:description "CVEの記録は、バッファの大きさの計算での整数オーバーフローがスタック上のバッファの範囲外への書き込みにつながると説明し、問題の種類をCWE-787としている。"@ja ;
    ks:evidence <https://www.cve.org/CVERecord?id=CVE-2025-6021>, <https://gitlab.gnome.org/GNOME/libxml2/-/issues/926> ;
    ks:verifiedAt "2026-11-13" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cve-2025-6021/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/denial-of-service/> ;
    schema:description "CVEの記録は結果としてメモリ破壊とサービス妨害を挙げている。Red HatのCVSS 3.1の評価は可用性への影響だけを高としている。"@ja ;
    ks:evidence <https://www.cve.org/CVERecord?id=CVE-2025-6021> ;
    ks:verifiedAt "2026-11-13" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/buffer-overrun/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/addresssanitizer/> ;
    schema:description "記事の実測では、libxml2 2.14.3をAddressSanitizerつきでビルドし、報告と同じ値でxmlBuildQNameを呼ぶと、100バイトのバッファへの2,147,483,637バイトの書き込みがstack-buffer-overflowとして検出された。libxml2 2.14.4では検出されなかった。上流の報告にも同じ書き込みのAddressSanitizerの出力がある。"@ja ;
    ks:evidence <https://gitlab.gnome.org/GNOME/libxml2/-/issues/926>, <https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html> ;
    ks:verifiedAt "2026-11-13" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/integer-overflow/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/gnatprove/> ;
    schema:description "修正前と同じ形の判定をSPARKのIntegerで書くと、GNATproveが足し算についてoverflow check might failを報告する。libxml3のBuildでは、必要なバイト数を求める足し算のオーバーフローの検査が証明された。"@ja ;
    ks:evidence <https://docs.adacore.com/spark2014-docs/html/ug/en/source/proof_checks_table.html>, <https://github.com/gomurin0428/libxml3/blob/13d2faf92654d2f5d97d7817572d8e074e7dcfda/docs/proof-report.md> ;
    ks:verifiedAt "2026-11-13" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/buffer-overrun/> ;
    schema:description "同じ式をAdaのIntegerで書いて報告と同じ値で呼ぶと、足し算でConstraint_Errorが送出され、書き込みには進まなかった。例外を処理しなければプログラムは止まるので、サービス妨害の余地は残る。pragma Suppressでオーバーフローの検査を外した場合は、この限りではない。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-3-5-4.html>, <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-11-5.html> ;
    ks:verifiedAt "2026-11-13" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/libxml3/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/spark/> ;
    schema:description "libxml3はXMLの処理をAda/SPARKで書いている。xmlBuildQNameに当たるXML3_Text.QNames.Buildは、上限から2バイトを引いた範囲で名前を測り、残りの範囲で接頭辞を測ってから足す。"@ja ;
    ks:evidence <https://github.com/gomurin0428/libxml3/blob/13d2faf92654d2f5d97d7817572d8e074e7dcfda/README.md>, <https://github.com/gomurin0428/libxml3/blob/13d2faf92654d2f5d97d7817572d8e074e7dcfda/src/xml3_text-qnames.adb#L104-L165> ;
    ks:verifiedAt "2026-11-13" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/libxml3/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/xmlbuildqname/> ;
    schema:description "libxml3はlibxml2に似たCのAPIの一部としてxmlBuildQNameを提供する。必要なバイト数が上限を超える入力にはNULLを返し、この点は新しい領域を確保して返すlibxml2 2.14.4と違う。ポインターが指す領域の実際の大きさとバイトの読み書きは証明の外にある。"@ja ;
    ks:evidence <https://github.com/gomurin0428/libxml3/blob/13d2faf92654d2f5d97d7817572d8e074e7dcfda/docs/compatibility.md>, <https://github.com/gomurin0428/libxml3/blob/13d2faf92654d2f5d97d7817572d8e074e7dcfda/docs/proof-report.md> ;
    ks:verifiedAt "2026-11-13" ;
    ks:certainty "context-dependent" .
