== fix/kashpureff == <> Kashpureff型の攻撃脆弱性の存在証明は[[../y.qmail.jp]]にあります。 ここでは簡単に防衛できることの証明(patch)を試みる。  lib/layer/iterate.c, rrcache.c を小修正 -- ToshinoriMaeno <> こんな話もあったのに、見落としたのだろうか。-- ToshinoriMaeno <> https://github.com/CZ-NIC/knot-resolver/commit/2800e375a79db9d35ffeaaa2e6e612c4345475f2 == kresdの修正 == === 外部名のadditional === 外部名NSに付随するAレコードは信用できないので、すてる。」 zone cut 情報に追加しない。(iterate.c) この辺に誤りか。 DEBUG_MSG("<= authority: ns outside bailiwick\n"); を見た記憶がない。 {{{ static int update_cut(knot_pkt_t *pkt, const knot_rrset_t *rr, struct kr_request *req) { struct kr_query *qry = req->current_query; struct kr_zonecut *cut = &qry->zone_cut; int state = KNOT_STATE_CONSUME; /* Authority MUST be at/below the authority of the nameserver, otherwise * possible cache injection attempt. */ if (!knot_dname_in(cut->name, rr->owner)) { DEBUG_MSG("<= authority: ns outside bailiwick\n"); #ifdef STRICT_MODE return KNOT_STATE_FAIL; #else /* Workaround: ignore out-of-bailiwick NSs for authoritative answers, * but fail for referrals. This is important to detect lame answers. */ if (knot_pkt_section(pkt, KNOT_ANSWER)->count == 0) { state = KNOT_STATE_FAIL; } return state; #endif } }}} kr_zonecut_addの後に検査を追加、DEBUG_MSGを追加 (これの有無で判別できる) {{{ kr_zonecut_add(cut, ns_name, NULL); ! if (knot_dname_in(rr->owner, ns_name)) { ! DEBUG_MSG("fetching glue for cut\n"); ! fetch_glue(pkt, ns_name, qry); ! } }}} === rrcache === additionalはrrcacheにも残さない。(rrcache.c)    残していい場合の判定が面倒だったので後回しにして、glueもキャッシュに入れないことにした。 static int stash_authority(struct kr_query *qry, knot_pkt_t *pkt, map_t *stash, knot_mm_t *pool) {{{ if (rr->type == KNOT_RRTYPE_NS) { DEBUG_MSG(qry, "XX stash_glue skip\n"); /* stash_glue(stash, pkt, knot_ns_name(&rr->rrs, 0), pool); */ } }}}     本来ならこれで問題は起きないはずだが、net/comで名前解決しないことが起きるはず。      現実に起きて、これまでの想像が正しいことが確認できた。      /etc/hostsに*.nstld.comなどのいくつかのホストを登録して、回避している。 === STRICT_MODE === iterate.c に #define STRICT_MODE 1 を追加しておく。         これはAA on のときにAuthority/Additionalを無視する効果がありそう。 static int process_authority(knot_pkt_t *pkt, struct kr_request *req) -- ToshinoriMaeno <> == その他 == update_cutあたりで上書きしているのも危険だが、いまは検討しない。 あとやりたいのはNXDOMAIN返答からのzone cuts不在情報の活用だ。  これは面倒w。 == cache == [[kresd/caches]] Kresdには三種類の記憶機構がある。 1. rrcache : rrsetを保持するもの 2. zone cuts : cutを保持する 3. pktcache : 返答(?)を保持している。用途ははっきりしない。