1. fix/kashpureff
Kashpureff型の攻撃脆弱性の存在証明は../y.qmail.jpにあります。
ここでは簡単に防衛できることの証明(patch)を試みる。
lib/layer/iterate.c, rrcache.c を小修正 -- ToshinoriMaeno 2016-04-13 03:59:03
こんな話もあったのに、見落としたのだろうか。-- ToshinoriMaeno 2016-04-14 01:23:54 https://github.com/CZ-NIC/knot-resolver/commit/2800e375a79db9d35ffeaaa2e6e612c4345475f2
2. kresdの修正
2.1. 外部名の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); ! }
2.2. 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などのいくつかのホストを登録して、回避している。
2.3. 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 2016-04-13 08:47:33
3. その他
update_cutあたりで上書きしているのも危険だが、いまは検討しない。
あとやりたいのはNXDOMAIN返答からのzone cuts不在情報の活用だ。
- これは面倒w。
4. cache
Kresdには三種類の記憶機構がある。
- rrcache : rrsetを保持するもの
- zone cuts : cutを保持する
- pktcache : 返答(?)を保持している。用途ははっきりしない。