Closed
Bug 1322420
Opened 8 years ago
Closed 8 years ago
[@ js::Scope::environmentChainLength] or Assertion failure: allocated(), at js/src/gc/Heap.h:591
Categories
(Core :: JavaScript Engine, defect)
Tracking
()
People
(Reporter: gkw, Assigned: jonco)
References
Details
(6 keywords, Whiteboard: [jsbugmon:update][adv-main51+][adv-esr45.7+])
Attachments
(2 files, 1 obsolete file)
(deleted),
text/plain
|
Details | |
(deleted),
patch
|
jonco
:
review+
gchang
:
approval-mozilla-aurora+
gchang
:
approval-mozilla-beta+
ritu
:
approval-mozilla-esr45+
dveditz
:
sec-approval+
|
Details | Diff | Splinter Review |
The following testcase crashes on mozilla-central revision c2526f6786f0 (build with --enable-debug --enable-more-deterministic, run with --fuzzing-safe --no-threads --no-baseline --no-ion):
// jsfunfuzz-generated
options('strict_mode');
// Adapted from randomly chosen test: js/src/jit-test/tests/debug/bug-826669.js
gczeal(9, 2);
var g1 = newGlobal();
var g2 = newGlobal();
var dbg = new Debugger();
dbg.addDebuggee(g1);
g1.eval('function f() {}');
dbg.findScripts({});
Backtrace:
0 js-dbg-64-dm-clang-darwin-c2526f6786f0 0x0000000105fec032 js::gc::TenuredCell::writeBarrierPost(void*, js::gc::TenuredCell*, js::gc::TenuredCell*) + 290 (Heap.h:591)
1 js-dbg-64-dm-clang-darwin-c2526f6786f0 0x000000010604189d js::FunctionScope::create(js::ExclusiveContext*, JS::Handle<js::FunctionScope::Data*>, bool, bool, JS::Handle<JSFunction*>, JS::Handle<js::Scope*>) + 557 (Scope.h:208)
2 js-dbg-64-dm-clang-darwin-c2526f6786f0 0x0000000105f61595 js::frontend::BytecodeEmitter::EmitterScope::enterFunction(js::frontend::BytecodeEmitter*, js::frontend::FunctionBox*) + 2101 (RootingAPI.h:792)
3 js-dbg-64-dm-clang-darwin-c2526f6786f0 0x0000000105f83afb js::frontend::BytecodeEmitter::emitFunctionFormalParametersAndBody(js::frontend::ParseNode*) + 379 (BytecodeEmitter.cpp:9026)
4 js-dbg-64-dm-clang-darwin-c2526f6786f0 0x0000000105f6aa5f js::frontend::BytecodeEmitter::emitTree(js::frontend::ParseNode*, js::frontend::BytecodeEmitter::EmitLineNumberNote) + 2143 (BytecodeEmitter.cpp:9425)
/snip
For detailed crash information, see attachment.
Locking s-s because GC is on the stack, to be safe.
Reporter | ||
Comment 1•8 years ago
|
||
Reporter | ||
Comment 2•8 years ago
|
||
This crashes opt builds at js::Scope::environmentChainLength as well.
Summary: Assertion failure: allocated(), at js/src/gc/Heap.h:591 → [@ js::Scope::environmentChainLength] or Assertion failure: allocated(), at js/src/gc/Heap.h:591
Reporter | ||
Comment 3•8 years ago
|
||
autoBisect shows this is probably related to the following changeset:
The first bad revision is:
changeset: https://hg.mozilla.org/mozilla-central/rev/40c8129cffbf
user: Jon Coppeard
date: Tue Dec 06 17:25:02 2016 -1000
summary: Bug 1213977 - Don't reset an ongoing incremental GC if AutoKeepAtoms is set r=sfink
Jon, is bug 1213977 a likely regressor?
Blocks: 1213977
Flags: needinfo?(jcoppeard)
Assignee | ||
Comment 4•8 years ago
|
||
So this looks the the first instance of a problem that the original AutoKeepAtoms behaviour was hiding.
What happens here is that we iterate through a compartment's lazy functions and create new references to them. These may have previously been unreachable. If we are in a incremental GC and have finished marking the roots these will never get marked and be finalized. This leads to use after free.
This patch is a spot fix that adds a read barrier here. The ultimate fix is to move this behaviour into the cell iterator so all clients get it automatically.
Assignee: nobody → jcoppeard
Flags: needinfo?(jcoppeard)
Attachment #8817329 -
Flags: review?(sphink)
Comment 5•8 years ago
|
||
Comment on attachment 8817329 [details] [diff] [review]
bug1322420-lazy-function-barrier
Review of attachment 8817329 [details] [diff] [review]:
-----------------------------------------------------------------
Ugh. I guess this means that findScripts is engaging in necromancy, which is kind of unfortunate.
::: js/src/jscompartment.cpp
@@ +1029,5 @@
> + // reference and trigger the read barrier.
> + if (cx->zone()->needsIncrementalBarrier())
> + fun->readBarrier(fun);
> +
> + // TODO: The above checks should be rolled into the cell iterator.
Sorry, but can you file a bug for this and put it here?
Attachment #8817329 -
Flags: review?(sphink) → review+
Comment 6•8 years ago
|
||
jimb, does the devtools debugger still use findScripts? It appears that it can keep things alive that otherwise wouldn't be. Which we can keep working, but I just wanted to make sure we need to.
Flags: needinfo?(jimb)
Assignee | ||
Comment 7•8 years ago
|
||
(In reply to Steve Fink [:sfink] [:s:] from comment #5)
> Sorry, but can you file a bug for this and put it here?
Sure, I should have done so originally.
Assignee | ||
Updated•8 years ago
|
Assignee | ||
Comment 8•8 years ago
|
||
Updated patch with review comments.
Attachment #8817968 -
Flags: review+
Assignee | ||
Updated•8 years ago
|
Attachment #8817329 -
Attachment is obsolete: true
Assignee | ||
Comment 9•8 years ago
|
||
Comment on attachment 8817968 [details] [diff] [review]
bug1322420-lazy-function-barrier v2
[Security approval request comment]
How easily could an exploit be constructed based on the patch? Hard, requires incremental GC being triggered at the right time.
Do comments in the patch, the check-in comment, or tests included in the patch paint a bulls-eye on the security problem? No.
Which older supported branches are affected by this flaw? Everything probably.
If not all supported branches, which bug introduced the flaw? I guess this goes all the way back to bug 678037.
Do you have backports for the affected branches? If not, how different, hard to create, and risky will they be? Should be trivial.
How likely is this patch to cause regressions; how much testing does it need? Unlikely.
Attachment #8817968 -
Flags: sec-approval?
Comment 10•8 years ago
|
||
(In reply to Steve Fink [:sfink] [:s:] from comment #6)
> jimb, does the devtools debugger still use findScripts? It appears that it
> can keep things alive that otherwise wouldn't be. Which we can keep working,
> but I just wanted to make sure we need to.
Unfortunately, yes. I'd like to eventually replace it with a breakpoint API that puts more of the work on SpiderMonkey but does not expose GC behavior, resurrect unreachable objects, or otherwise behave like what the GC considers a sociopath.
Flags: needinfo?(jimb)
Updated•8 years ago
|
Keywords: csectype-uaf
Updated•8 years ago
|
status-firefox50:
--- → wontfix
status-firefox51:
--- → affected
status-firefox52:
--- → affected
status-firefox-esr45:
--- → affected
tracking-firefox51:
--- → +
tracking-firefox52:
--- → +
tracking-firefox53:
--- → +
tracking-firefox-esr45:
--- → 51+
Comment 11•8 years ago
|
||
Comment on attachment 8817968 [details] [diff] [review]
bug1322420-lazy-function-barrier v2
sec-approval=dveditz
Attachment #8817968 -
Flags: sec-approval? → sec-approval+
Assignee | ||
Comment 12•8 years ago
|
||
Status: NEW → RESOLVED
Closed: 8 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla53
Updated•8 years ago
|
Status: RESOLVED → VERIFIED
Comment 14•8 years ago
|
||
JSBugMon: This bug has been automatically verified fixed.
Comment 15•8 years ago
|
||
Hi :jonco,
Is this worth uplifting to Beta51 & Aurora52?
Flags: needinfo?(jcoppeard)
Assignee | ||
Comment 16•8 years ago
|
||
The testcase didn't cause a crash on versions before bug 1213977 landed, but it's a real problem so we should fix it anyway.
Flags: needinfo?(jcoppeard)
Assignee | ||
Comment 17•8 years ago
|
||
Comment on attachment 8817968 [details] [diff] [review]
bug1322420-lazy-function-barrier v2
Approval Request Comment
[Feature/Bug causing the regression]: Bug 678037.
[User impact if declined]: Possible crashes while debugging.
[Is this code covered by automated tests?]: Yes.
[Has the fix been verified in Nightly?]: Yes.
[Needs manual test from QE? If yes, steps to reproduce]: No.
[List of other uplifts needed for the feature/fix]: None
[Is the change risky?]: No.
[Why is the change risky/not risky?]: The patch is simple and just adds a read barrier.
[String changes made/needed]: None.
Attachment #8817968 -
Flags: approval-mozilla-beta?
Attachment #8817968 -
Flags: approval-mozilla-aurora?
Comment 18•8 years ago
|
||
Comment on attachment 8817968 [details] [diff] [review]
bug1322420-lazy-function-barrier v2
Fix a sec-high. Beta51+ & Aurora52+. Should be in 51 beta 10.
Attachment #8817968 -
Flags: approval-mozilla-beta?
Attachment #8817968 -
Flags: approval-mozilla-beta+
Attachment #8817968 -
Flags: approval-mozilla-aurora?
Attachment #8817968 -
Flags: approval-mozilla-aurora+
Comment 19•8 years ago
|
||
Updated•8 years ago
|
Group: javascript-core-security → core-security-release
Assignee | ||
Comment 20•8 years ago
|
||
Comment on attachment 8817968 [details] [diff] [review]
bug1322420-lazy-function-barrier v2
[Approval Request Comment]
If this is not a sec:{high,crit} bug, please state case for ESR consideration: sec-high bug.
User impact if declined: Possible crash / security vulnerability.
Fix Landed on Version: 53
Risk to taking this patch (and alternatives if risky): Low
String or UUID changes made by this patch: None
See https://wiki.mozilla.org/Release_Management/ESR_Landing_Process for more info.
Attachment #8817968 -
Flags: approval-mozilla-esr45?
Comment on attachment 8817968 [details] [diff] [review]
bug1322420-lazy-function-barrier v2
Sec-high, meets the ESR triage bar, should be in ESR45.7
Attachment #8817968 -
Flags: approval-mozilla-esr45? → approval-mozilla-esr45+
Assignee | ||
Comment 22•8 years ago
|
||
Updated•8 years ago
|
Updated•8 years ago
|
Whiteboard: [jsbugmon:update] → [jsbugmon:update][adv-main51+][adv-esr45.7+]
Comment hidden (obsolete) |
Comment hidden (obsolete) |
Comment 25•8 years ago
|
||
(The commit https://hg.mozilla.org/mozilla-central/rev/4e919ac282a4 that was linked to this bug was actually for bug 1322971.)
Updated•7 years ago
|
Group: core-security-release
You need to log in
before you can comment on or make changes to this bug.
Description
•