1. fix/kashpureff

Kashpureff型の攻撃脆弱性の存在証明は../y.qmail.jpにあります。

ここでは簡単に防衛できることの証明(patch)を試みる。

こんな話もあったのに、見落としたのだろうか。-- ToshinoriMaeno 2016-04-14 01:23:54 https://github.com/CZ-NIC/knot-resolver/commit/2800e375a79db9d35ffeaaa2e6e612c4345475f2

2. kresdの修正

2.1. 外部名のadditional

外部名NSに付随するAレコードは信用できないので、すてる。」

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)

            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);
                        */
                } 

2.3. STRICT_MODE

iterate.c に #define STRICT_MODE 1 を追加しておく。     

-- ToshinoriMaeno 2016-04-13 08:47:33

3. その他

update_cutあたりで上書きしているのも危険だが、いまは検討しない。

あとやりたいのはNXDOMAIN返答からのzone cuts不在情報の活用だ。

4. cache

kresd/caches

Kresdには三種類の記憶機構がある。

  1. rrcache : rrsetを保持するもの
  2. zone cuts : cutを保持する
  3. pktcache : 返答(?)を保持している。用途ははっきりしない。