Last Comment Bug 570657 - 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
: nsCOMArray is inconsistent with the order in which it releases and removes el...
Status: RESOLVED FIXED
[sg:critical] [qa-ntd-192] [qa-ntd-191]
:
Product: Core
Classification: Components
Component: XPCOM (show other bugs)
: Trunk
: x86 Mac OS X
: -- normal (vote)
: mozilla1.9.3a5
Assigned To: :Ehsan Akhgari (out sick)
:
Mentors:
http://mxr.mozilla.org/mozilla-centra...
Depends on:
Blocks:
  Show dependency treegraph
 
Reported: 2010-06-07 21:31 PDT by :Ehsan Akhgari (out sick)
Modified: 2010-09-27 18:03 PDT (History)
9 users (show)
ehsan: in‑testsuite+
See Also:
Crash Signature:
(edit)
QA Whiteboard:
Iteration: ---
Points: ---
Has Regression Range: ---
Has STR: ---
beta1+
.7+
.7-fixed
.11+
.11-fixed


Attachments
Patch (v1) (6.09 KB, patch)
2010-06-07 22:40 PDT, :Ehsan Akhgari (out sick)
no flags Details | Diff | Review
Patch (v1.1) (6.16 KB, patch)
2010-06-07 22:47 PDT, :Ehsan Akhgari (out sick)
no flags Details | Diff | Review
Patch (v1.2) (6.15 KB, patch)
2010-06-08 13:15 PDT, :Ehsan Akhgari (out sick)
shaver: review+
dveditz: approval1.9.2.7+
christian: approval1.9.1.11+
Details | Diff | Review

Description :Ehsan Akhgari (out sick) 2010-06-07 21:31:23 PDT
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.
Comment 1 :Ehsan Akhgari (out sick) 2010-06-07 22:40:49 PDT
Created attachment 449799 [details] [diff] [review]
Patch (v1)

Patch + tests.
Comment 2 :Ehsan Akhgari (out sick) 2010-06-07 22:47:43 PDT
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.
Comment 3 :Ehsan Akhgari (out sick) 2010-06-08 13:15:26 PDT
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!
Comment 4 Mike Shaver (:shaver -- probably not reading bugmail closely) 2010-06-08 13:24:09 PDT
Comment on attachment 449921 [details] [diff] [review]
Patch (v1.2)

r=shaver
Comment 5 :Ehsan Akhgari (out sick) 2010-06-08 13:29:43 PDT
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.
Comment 6 :Ehsan Akhgari (out sick) 2010-06-09 12:17:04 PDT
http://hg.mozilla.org/mozilla-central/rev/af44e6577313
Comment 7 christian 2010-06-11 15:57:11 PDT
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.
Comment 9 Al Billings [:abillings] 2010-06-21 17:41:28 PDT
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.
Comment 10 :Ehsan Akhgari (out sick) 2010-06-21 20:48:44 PDT
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.
Comment 11 Al Billings [:abillings] 2010-06-22 17:54:30 PDT
Nothing for QA to do further here then.

Note You need to log in before you can comment on or make changes to this bug.