Package: isc-dhcp-server Version: 4.1.1-P1-15 Severity: grave Tags: security patch
Hi Ari, Just as a public record, the following advisory (CVE-2011-0413[0]) has been published by ISC[1]: > When the DHCPv6 server code processes a message for an address that was > previously declined and internally tagged as abandoned it can trigger an > assert failure resulting in the server crashing. This could be used to > crash DHCPv6 servers remotely. This issue only affects DHCPv6 servers. > DHCPv4 servers are unaffected. I'm attaching the patch that was used for 4.1-ESV, which applies almost cleanly in 4.1.1-P1 (3 lines diff between hunks.) I have not tested it, though. [0]http://security-tracker.debian.org/tracker/CVE-2011-0413 http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-0413 [1]http://www.isc.org/software/dhcp/advisories/cve-2011-0413 Cheers, -- Raphael Geissert - Debian Developer www.debian.org - get.debian.net
--- dhcp-4.1-ESV/server/mdb6.c +++ dhcp-4.1-ESV-R1/server/mdb6.c @@ -1009,7 +1009,7 @@ move_lease_to_active(struct ipv6_pool *pool, struct iasubopt *lease) { * Renew an lease in the pool. * * To do this, first set the new hard_lifetime_end_time for the resource, - * and then invoke renew_lease() on it. + * and then invoke renew_lease6() on it. * * WARNING: lease times must only be extended, never reduced!!! */ @@ -1019,12 +1019,24 @@ renew_lease6(struct ipv6_pool *pool, struct iasubopt *lease) { * If we're already active, then we can just move our expiration * time down the heap. * + * If we're abandoned then we are already on the active list + * but we need to retag the lease and move our expiration + * from infinite to the current value + * * Otherwise, we have to move from the inactive heap to the * active heap. */ if (lease->state == FTS_ACTIVE) { isc_heap_decreased(pool->active_timeouts, lease->heap_index); return ISC_R_SUCCESS; + } else if (lease->state == FTS_ABANDONED) { + char tmp_addr[INET6_ADDRSTRLEN]; + lease->state = FTS_ACTIVE; + isc_heap_increased(pool->active_timeouts, lease->heap_index); + log_info("Reclaiming previously abandoned address %s", + inet_ntop(AF_INET6, &(lease->addr), tmp_addr, + sizeof(tmp_addr))); + return ISC_R_SUCCESS; } else { return move_lease_to_active(pool, lease); } @@ -1112,7 +1124,8 @@ isc_result_t decline_lease6(struct ipv6_pool *pool, struct iasubopt *lease) { isc_result_t result; - if (lease->state != FTS_ACTIVE) { + if ((lease->state != FTS_ACTIVE) && + (lease->state != FTS_ABANDONED)) { result = move_lease_to_active(pool, lease); if (result != ISC_R_SUCCESS) { return result;
signature.asc
Description: This is a digitally signed message part.