Closed Bug 570657 Opened 10 years ago Closed 10 years ago
COMArray 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
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.
Patch + tests.
Actually, make sure in the test that we never manage to remove the element from the destructor.
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 #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: --- → ?
Status: ASSIGNED → RESOLVED
Closed: 10 years ago
Resolution: --- → FIXED
Whiteboard: [sg:critical][critsmash:patch] → [sg:critical]
Target Milestone: --- → mozilla1.9.3a5
Comment on attachment 449921 [details] [diff] [review] Patch (v1.2) a=LegNeato for 22.214.171.124 and 126.96.36.199. Please land this on mozilla-1.9.2 default and mozilla-1.9.1 default.
Attachment #449921 - Flags: approval188.8.131.52+ → approval184.108.40.206+
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]
You need to log in before you can comment on or make changes to this bug.