Note: There are a few cases of duplicates in user autocompletion which are being worked on.

nsCOMArray is inconsistent with the order in which it releases and removes elements from the array, which can cause a refcount to be decreased more than necessary

RESOLVED FIXED in mozilla1.9.3a5

Status

()

Core
XPCOM
RESOLVED FIXED
7 years ago
7 years ago

People

(Reporter: Ehsan, Assigned: Ehsan)

Tracking

Trunk
mozilla1.9.3a5
x86
Mac OS X
Points:
---
Bug Flags:
in-testsuite +

Firefox Tracking Flags

(blocking2.0 beta1+, blocking1.9.2 .7+, status1.9.2 .7-fixed, blocking1.9.1 .11+, status1.9.1 .11-fixed)

Details

(Whiteboard: [sg:critical] [qa-ntd-192] [qa-ntd-191], URL)

Attachments

(1 attachment, 2 obsolete attachments)

See bug 570350 comment 6 about what caused me to discover this issue.

When nsCOMArray::Clear is called, the interfaces are released *before* they're actually removed from the array.  So, given an interface which calls nsCOMArray::RemoveObject (or other similar methods) from its Release method, you could get into situations where an object is attempted to be removed twice, and therefore decrementing its refcount more than necessary.

I also see similar things in other methods handling removing items from nsCOMArrays.  I think we should have a well-defined order of "removing the object from the array and then calling Release on it, in order to avoid such problems.

The reason that I'm filing this in the security group is that it is (theoretically) possible to study our code to determine places in the code where this might happen (either now or in the future) and then construct a scenario when this caused an object to be deleted with outstanding interface pointers to it, and then use the dangling pointer in combination with other techniques to construct an attach scenario.
Assignee: nobody → ehsan
Status: NEW → ASSIGNED
Created attachment 449799 [details] [diff] [review]
Patch (v1)

Patch + tests.
Attachment #449799 - Flags: review?(shaver)
Created attachment 449800 [details] [diff] [review]
Patch (v1.1)

Actually, make sure in the test that we never manage to remove the element from the destructor.
Attachment #449799 - Attachment is obsolete: true
Attachment #449800 - Flags: review?(shaver)
Attachment #449799 - Flags: review?(shaver)

Updated

7 years ago
Whiteboard: [sg:critical][critsmash:patch]
Created attachment 449921 [details] [diff] [review]
Patch (v1.2)

I have *no* idea how this test was passing for me last night.  But now the patch is actually correct, and passes the tests!
Attachment #449800 - Attachment is obsolete: true
Attachment #449921 - Flags: review?(shaver)
Attachment #449800 - Flags: review?(shaver)
Attachment #449921 - Attachment description: Patch (v1) → Patch (v1.2)
Comment on attachment 449921 [details] [diff] [review]
Patch (v1.2)

r=shaver
Attachment #449921 - Flags: review?(shaver) → review+
The fix here is localized and safe, and the exact threat level is not something which can be evaluated with certainty, so I'd recommend to block on this for all branches as well as 1.9.3.
blocking1.9.1: --- → ?
blocking1.9.2: --- → ?
blocking2.0: --- → ?
blocking2.0: ? → beta1+

Updated

7 years ago
blocking1.9.1: ? → .11+
blocking1.9.2: ? → .6+
http://hg.mozilla.org/mozilla-central/rev/af44e6577313
Status: ASSIGNED → RESOLVED
Last Resolved: 7 years ago
Flags: in-testsuite+
Resolution: --- → FIXED
Whiteboard: [sg:critical][critsmash:patch] → [sg:critical]
Target Milestone: --- → mozilla1.9.3a5
Attachment #449921 - Flags: approval1.9.2.5?
Attachment #449921 - Flags: approval1.9.1.11?

Comment 7

7 years ago
Comment on attachment 449921 [details] [diff] [review]
Patch (v1.2)

a=LegNeato for 1.9.2.6 and 1.9.1.11. Please land this on mozilla-1.9.2 default and mozilla-1.9.1 default.
Attachment #449921 - Flags: approval1.9.2.5?
Attachment #449921 - Flags: approval1.9.2.5+
Attachment #449921 - Flags: approval1.9.1.11?
Attachment #449921 - Flags: approval1.9.1.11+
status1.9.1: --- → wanted
status1.9.2: --- → wanted
Attachment #449921 - Flags: approval1.9.2.5+ → approval1.9.2.6+
http://hg.mozilla.org/releases/mozilla-1.9.2/rev/b1f21f894e9d
http://hg.mozilla.org/releases/mozilla-1.9.1/rev/12a069c6f52d
status1.9.1: wanted → .11-fixed
status1.9.2: wanted → .6-fixed
Two questions, Ehsan:

1) Are there no tests to be checked in for 1.9.2 and 1.9.1? I see that there is a test running on builds in mozilla central.

2) Since this is a security bug, shouldn't the tests for mozilla central not be checked in yet, per policy, until we unhide the bug?

For QA, I'm trying to figure out what needs to be done to verify this bug on branches.
Whiteboard: [sg:critical] → [sg:critical] [qa-examined-192] [qa-examined-191]
Unfortunately (or maybe fortunately?) we don't have any STRs to exploit this problem.  I found out about this problem while working on the editor using a half-baked patch, but that patch was never committed to any repository.

The tests for this bug only test the implementation, and do not uncover any potential attacks.

My mozilla-central patch modified the existing nsCOMArray test, but unfortunately that test does not exist on our branches.

Frankly, I can't think of any way to verify this except for reading the code and reasoning about it, but I'm not sure if that's good enough for your verification purposes.
Nothing for QA to do further here then.
Whiteboard: [sg:critical] [qa-examined-192] [qa-examined-191] → [sg:critical] [qa-ntd-192] [qa-ntd-191]
Group: core-security
You need to log in before you can comment on or make changes to this bug.