Upgrade to Pro — share decks privately, control downloads, hide ads and more …

権威DNSサーバを作ってみよう ゼロから始めるファジング生活

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

権威DNSサーバを作ってみよう ゼロから始めるファジング生活

Avatar for Toshifumi Sakaguchi

Toshifumi Sakaguchi

August 07, 2018
Tweet

More Decks by Toshifumi Sakaguchi

Other Decks in Technology

Transcript

  1. 動機 これまで • 公開されたDNSサーバの脆弱性を検証 • フルリゾルバの脆弱性を検証する場合は、特殊な応答を返す権威サ ーバを作成 課題 • 権威サーバの作成を効率化

    • DNSSEC validation有効時のみ影響のある脆弱性にも対応 この課題の対応を検討中に、応答の自動生成によるフルリゾルバ専用 のファジングツールの作成を思いつく 4
  2. ファジングの実装 過去の(BINDなどの)脆弱性を参考に実装 • RRの追加・変更・削除 – RRを追加 • CNAME/DNAME – CVE-2017-3137(https://kb.isc.org/article/AA-01466/0/)

    A response packet can cause a resolver to terminate when processing an answer containing a CNAME or DNAME • DNSSEC関連 (DNSKEY/RRSIG/DS/NSEC/NSEC3) – DNSSEC validation有効なときの脆弱性があったため – CVE-2017-15908(http://blog.trendmicro.co.jp/archives/16583) "Linux PC に対する DoS 攻撃が可能な「systemd」の脆弱性について解説" • TSIG, TKEYなどのRR – CVE-2016-9131(https://www.fortinet.com/blog/threat-research/analysis-of-isc-bind-tkey-query-response-handling-dos- cve-2016-9131.html) Analysis of ISC BIND TKEY Query Response Handling DoS (CVE-2016-9131) • ドメイン名を乱数から自動生成 8
  3. ファジングの実装 – RRのクラスを変更 • IN ⇒ CH/HS/NONE/ANY CVE-2015-8000(https://kb.isc.org/article/AA-01317) Responses with

    a malformed class attribute can trigger an assertion failure in db.c – 乱数をもとに作成したTTL/TYPE/RDATA 未実装のRRに対応 – OPT RR • ペイロードサイズ、拡張RCODEを乱数から生成 CVE-2016-2848(https://kb.isc.org/article/AA-01317) A packet with malformed options can trigger an assertion ... • NSID, ECS, COOKIE, TCP-KEEPALIVEを追加 • 乱数をもとに作成したOPTION 9
  4. ファジングの実装 • RCODEの変更 • 署名 – ファジングで追加・変更したRRSetも署名 – OPT, TSIG,

    RRSIGなども署名 • 各セクションでのRRの順序変更 • DNSメッセージの変更 – バイナリデータの追加・変更・削除 10
  5. ファジングの実装 クライアント(スタブリゾルバ) • 問い合わせの作成 – QNAME 権威サーバ側のゾーンデータをもとに生成 – QTYPE, QCLASS

    乱数から生成 – OPT ペイロードサイズを乱数から生成 • 問い合わせを一定間隔でフルリゾルバへ送信 フルリゾルバが異常終了するまで放置 11
  6. 調査対象 • フルリゾルバ – BIND 9.12.x, 9.7.x(CentOS 6.x RPM) –

    Unbound – PowerDNS 3.x, 4.x – Knot Resolver • ついでに – dnsmasq – dnsdist – coredns 14
  7. 調査対象 15 fuzz_server BIND 9.7.x PowerDNS Recursor 4.x PowerDNS Recursor

    3.x Knot Resolver Unbound Unbound Unbound dnsmasq coredns dnsdist fuzz_client Unbound BIND 9.12.x
  8. 結果1 • PowerDNS Security Advisory 2017-08: Crafted CNAME answer can

    cause a denial of service – https://doc.powerdns.com/recursor/security-advisories/powerdns-advisory-2017-08.html • Knot Resolver: fix CVE-2018-1110: denial of service triggered by malformed DNS messages (2件の問題) https://lists.nic.cz/pipermail/knot-resolver-announce/2018/000000.html – https://gitlab.labs.nic.cz/knot/knot-resolver/issues/334 – https://gitlab.labs.nic.cz/knot/knot-resolver/issues/335 • Knot-Resolver 2.3.0 crashes in module/stats. libknot(knot-dns)の"knot_dname_to_str memory overflow"に起因 – https://gitlab.labs.nic.cz/knot/knot-dns/raw/v2.6.7/NEWS – https://gitlab.labs.nic.cz/knot/knot-resolver/issues/354 17
  9. 結果2 • knot-resolver 2.3.0 aborted with "kresd: libknot/packet/pkt.c:84: pkt_wire_alloc: Assertion

    `len >= KNOT_WIRE_HEADER_SIZE' failed." – https://gitlab.labs.nic.cz/knot/knot-resolver/issues/366 – 反復問い合わせ中のある状態で、DNSヘッダサイズより小さな応答を受信すると、強制終了する – ChangeLogではなぜか"minimal libknot version is now 2.6.7 to pull in latest fixes (#366 (closed))"とい う扱い – CVE assignment"後に修正予定 → Knot Resolver 2.4.1がリリースされた 18