Skip to content

Disable MongoDB server-side JavaScript

Severity: mediumApplies to: MongoDB 6.x / 7.x / 8.x
The fix/etc/mongod.conf
security:
javascriptEnabled: false
Terminal window
sudo systemctl restart mongod

MongoDB can evaluate JavaScript as part of a query. $where takes a JS expression, $function and $accumulator run JS in aggregation pipelines, and mapReduce is JS by definition.

The risk is injection. An application that interpolates user input into a $where clause has handed the user a JavaScript expression evaluated by the database:

// application code — the bug
db.users.find({ $where: `this.name == '${userInput}'` })

Input of ' || true || ' makes the predicate always true and returns every document, authorization checks on the query notwithstanding. Input containing a while(true) loop consumes a server thread — a denial of service from a search box.

Turning JS off removes the operator entirely. There is nothing to inject into.

This is not remote code execution on the host, and a lot of writing implies it is.

MongoDB runs this JavaScript in an embedded SpiderMonkey interpreter with no filesystem access, no network access, and no shell. An attacker who injects into $where gets to evaluate an expression against documents and burn CPU. They do not get a shell, they cannot write a file, and there is no equivalent of Redis’s CONFIG SET dir or MySQL’s UDF path.

So the realistic outcomes are query-logic bypass and denial of service — both real, neither a host compromise. That’s why this is medium and not critical, and why it sits below authorization, binding and roles on the list. Fix those first.

The reason this is an easy win: $where and mapReduce are slow, can’t use indexes well, and have been discouraged by MongoDB for years. The aggregation framework replaced mapReduce — MongoDB deprecated it in 4.4 — and query operators cover nearly everything $where was used for.

Most applications written in the last several years use none of it, so this is usually a free removal. Check rather than assume, but expect to find nothing.