Closed Bug 597618 Opened 14 years ago Closed 14 years ago

workaround: short-curcuit infinite loop in pkix_BuildForwardDepthFirstSearch when verifying the https://etime1.jt3.com/ server certificate with AIA certificate fetch enabled

Categories

(NSS :: Libraries, defect, P2)

defect

Tracking

(Not tracked)

RESOLVED FIXED
3.12.10

People

(Reporter: wtc, Assigned: alvolkov.bgs)

References

()

Details

(Whiteboard: 4_3.12.10)

Attachments

(3 files)

This is the bug I mentioned in the NSS conference call this week. After I looked into it, I found that it is not specific to AIA certificate download using LDAP. HTTP certificate download has the same bug. But it seems to be related to cross certificates. Steps to reproduce: 1. Apply the NSS patch in bug 528743 to ignore unknown AIA location types. 2. Edit mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_aiamgr.c and comment out the following code in PKIX_PL_AIAMgr_GetAIACerts so that libpkix will not use LDAP to download certificates: } else if (iaType == PKIX_INFOACCESS_LOCATION_LDAP) { PKIX_CHECK(pkix_pl_AIAMgr_GetLDAPCerts (aiaMgr, ia, &nbio, &certs, plContext), PKIX_AIAMGRGETLDAPCERTSFAILED); 3. Use CERT_PKIXVerifyCert to verify the server certificate for https://etime1.jt3.com/, with AIA certificate fetch enabled. You will see that the while loop in pkix_BuildForwardDepthFirstSearch does not terminate.
I debugged this infinite loop for a full day today but couldn't track this down. For now I propose that we limit that while loop to a maximum number of iterations to defend against such bugs.
Attachment #476459 - Flags: review?(alexei.volkov.bugs)
Comment on attachment 476459 [details] [diff] [review] Safety net: max loop iteration count for pkix_BuildForwardDepthFirstSearch I forgot to mention that I also created a pkix_PrepareForwardBuilderStateForAIA function for code that was duplicated in two places. I also deleted several unnecessary blank lines because the pkix_BuildForwardDepthFirstSearch function is extremely long.
Assignee: nobody → alexei.volkov.bugs
Whiteboard: 4_3.12.10
Target Milestone: --- → 3.12.10
Comment on attachment 476459 [details] [diff] [review] Safety net: max loop iteration count for pkix_BuildForwardDepthFirstSearch I think 250 a bit too much for chains we have today. Probably if it is more then a hundred it is already an indication that some thing is wrong. r+
Attachment #476459 - Flags: review?(alexei.volkov.bugs) → review+
Comment on attachment 476459 [details] [diff] [review] Safety net: max loop iteration count for pkix_BuildForwardDepthFirstSearch Requesting the second review. I'd like to see it in 3.12.10.
Attachment #476459 - Flags: superreview?(rrelyea)
Comment on attachment 476459 [details] [diff] [review] Safety net: max loop iteration count for pkix_BuildForwardDepthFirstSearch r+ rrelyea
Attachment #476459 - Flags: superreview?(rrelyea) → superreview+
Patch checked in on the NSS trunk (NSS 3.13) and the NSS_3_12_BRANCH (NSS 3.12.10). Checking in pkix_build.c; /cvsroot/mozilla/security/nss/lib/libpkix/pkix/top/pkix_build.c,v <-- pkix_bui ld.c new revision: 1.60; previous revision: 1.59 done Checking in pkix_build.c; /cvsroot/mozilla/security/nss/lib/libpkix/pkix/top/pkix_build.c,v <-- pkix_bui ld.c new revision: 1.59.2.1; previous revision: 1.59 done We're unlikely to have time to get to the bottom of this soon, so I marked this bug FIXED even though I only checked in a workaround.
Status: NEW → RESOLVED
Closed: 14 years ago
Resolution: --- → FIXED
Summary: The while loop in pkix_BuildForwardDepthFirstSearch does not terminate when verifying the https://etime1.jt3.com/ server certificate with AIA certificate fetch enabled → workaround: short-curcuit infinite loop in pkix_BuildForwardDepthFirstSearch when verifying the https://etime1.jt3.com/ server certificate with AIA certificate fetch enabled
I attach this patch to illustrate a possible solution to this bug. I spent two days looking into this bug. I confirmed what Alexei told me before, that libpkix does not go into an infinite loop. With AIA cert fetching, a total of 78 certificates are considered by the cert path building code, and this causes libpkix to stay in the loop for many iterations. Some of the certs have a high fan-out: I see 7 and 10. Also, I see the chain length go as high as 16 or 17. Possible solutions: 1. Limit the max chain length. 2. Limit the max fan-out. This may require we assign good scores to certs so we know which ones are more likely to be useful in chain building. 3. Mark the certs that have been tried as visited to prune the depth first search. This is part of the standard depth first search algorithm This patch illustrates how this solution can be implemented. However, it is tricky to do this safely. The subtle issue is that although a cert is unusable in one cert path (e.g., because the name constraint or policy check fails), the cert may still be usable in other cert paths. So we can only mark a cert as visited if we are sure it is futile to use the cert in any cert path. One sufficient condition is that the cert cannot reach any trusted cert. (I believe libpkix only performs policy and name constraint checks after reaching a trusted cert.) This patch implements this "trusted cert reached" check partially. I didn't check whether we can't reach a trusted cert because of cert looping. Without this patch, libpkix takes 318468 iterations in its DFS to explore the graph of 78 certificates. With this patch, libpkix takes 3068 iterations to finish DFS. If I remove the !trustedCertReached check, then libpkix takes 263 iterations to finish DFS. But I think this is risky if policy or name constraint checks are performed.
When unzipped, this ZIP file expands to a bug-597618 directory containing the following certificates: etime1_jt3_com.der: the SSL server certificate for etime1.jt3.com. etime1_jt3_com_cert0.der - etime1_jt3_com_cert78.der: the certificates that are downloaded from AIA cert fetching. To reproduce this bug, 1. Edit mozilla/security/nss/lib/libpkix/pkix/top/pkix_build.c and comment out the following code at the beginning of the while loop in pkix_BuildForwardDepthFirstSearch: /* * The maximum number of iterations works around a bug that * causes this while loop to never exit when AIA and cross * certificates are involved. See bug xxxxx. */ if (numIterations++ > 250) PKIX_ERROR(PKIX_TIMECONSUMEDEXCEEDSRESOURCELIMITS); 2. Write a test program that does the following: - Import etime1_jt3_com_cert*.der (from 0 to 78) into NSS as temporary certs. - Call CERT_PKIXVerifyCert to verify etime1_jt3_com.der, WITHOUT AIA cert fetching.
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: