🛡️ CVE-2022-36085 — open-policy-agent
Description
OPA Compiler: Bypass of WithUnsafeBuiltins using "with" keyword to mock functions
Impact
The Rego compiler provides a (deprecated) WithUnsafeBuiltins function, which allows users to provide a set of built-in functions that should be deemed unsafe — and as such rejected — by the compiler if encountered in the policy compilation stage. A bypass of this protection has been found, where the use of the with keyword to mock such a built-in function (a feature introduced in OPA v0.40.0), isn’t taken into account by WithUnsafeBuiltins.
The same method is exposed via rego.UnsafeBuiltins in the github.com/open-policy-agent/opa/rego package.
When provided e.g. the http.send built-in function to WithUnsafeBuiltins, the following policy would still compile, and call the http.send function with the arguments provided to the is_object function when evaluated:
```rego
package policy
foo := is_object({
"method": "get",
"url": "https://www.openpolicyagent.org"
})
allow := r {
r := foo with is_object as http.send
}
```
Both built-in functions and user provided (i.e. custom) functions are mockable using this construct.
In addition to http.send, the opa.runtime built-in function is commonly considered unsafe in integrations where policy provided by untrusted parties is evaluated, as it risks exposing configuration, or environment variables, potentially carrying sensitive information.
Affected Users
All of these conditions have to be met to create an adverse effect:
- Use the Go API for policy evaluation (not the OPA server, or the Go SDK)
- Make use of the
WithUnsafeBuiltinsmethod in order to deny certain built-in functions, like e.g.http.send, from being used in policy evaluation. - Allow policy evaluation of policies provided by untrusted parties.
- The policies evaluated include the
withkeyword to rewrite/mock a built-in, or custom, function to that of another built-in function, such ashttp.send.
Additionally, the OPA Query API is affected:
- If the OPA [Query API](https://www.openpolicyagent.org/docs/latest/rest-api/#query-api) is exposed to the public, and it is relied on
http.sendto be unavailable in that context. Exposing the OPA API to the public without proper [authentication and authorization](https://www.openpolicyagent.org/docs/latest/security/#authentication-and-authorization) in place is generally advised against.
Patches
v0.43.1, v0.44.0
Workarounds
The WithUnsafeBuiltins function has been considered deprecated since the introduction of the [capabilities](https://www.openpolicyagent.org/docs/latest/deployments/#capabilities) feature in OPA v0.23.0 . While the function was commented as deprecated, the format of the comment was however not following the [convention](https://zchee.github.io/golang-wiki/Deprecated/) for deprecated functions, and might not have been picked up by tooling like editors. This has now been fixed. Users are still encouraged to use the capabilities feature over the deprecated WithUnsafeBuiltins function.
If you cannot upgrade, consider using capabilities instead:
Code like this using the github.com/open-policy-agent/opa/ast package:
```go
// VULNERABLE with OPA <= 0.43.0
unsafeBuiltins := map[string]struct{}{
ast.HTTPSend.Name: struct{}{},
}
compiler := ast.NewCompiler().WithUnsafeBuiltins(unsafeBuiltins)
```
needs to be changed to this:
```go
caps := ast.CapabilitiesForThisVersion()
var j int
for i, bi := range caps.Builtins {
if bi.Name == ast.HTTPSend.Name {
j = i
break
}
}
caps.Builtins[j] = caps.Builtins[len(caps.Builtins)-1] // put last element into position j
caps.Builtins = caps.Builtins[:len(caps.Builtins)-1] // truncate slice
compiler := ast.NewCompiler().WithCapabilities(caps)
```
When using the github.com/open-policy-agent/opa/rego package:
```go
// VULNERABLE with OPA <= 0.43.0
r := rego.New(
// other options omitted
rego.UnsafeBuiltins(map[string]struct{}{ast.HTTPSend.Name: struct{}{}}),
)
```
needs to be changed to
```go
r := rego.New(
// other options omitted
rego.Capabilities(caps),
)
```
with caps defined above.
Note that in the process, some error messages will change: http.send in this example will no longer be "unsafe" and thus forbidden, but it will simply become an "unknown function".
References
- Fix commit on
main: https://github.com/open-policy-agent/opa/commit/25a597bc3f4985162e7f65f9c36599f4f8f55823 - Fix commit in 0.43.1 release: https://github.com/open-policy-agent/opa/commit/3e8c754ed007b22393cf65e48751ad9f6457fee8, release page for 0.43.1: https://github.com/open-policy-agent/opa/releases/tag/v0.43.1
- Function mocking feature introduced in https://github.com/open-policy-agent/opa/pull/4540 and https://github.com/open-policy-agent/opa/pull/4616
- Documentation on the [capabilities](https://www.openpolicyagent.org/docs/latest/deployments/#capabilities) feature, which is the preferred way of providing a list of allowed built-i
How this vulnerability can be exploited
This issue can be reached over the network, attack complexity is high, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality high, integrity high, availability none.
Weakness class
CVE-2022-36085 is classified as CWE-20: Improper Input Validation. The application accepts input without checking that it has the expected form, so malformed values reach code that assumes they are well formed.
Affected software
CVE-2022-36085 is recorded against 2 packages.
- github.com/open-policy-agent/opa
- open-policy-agent (from 0.40.0 up to 0.43.1)
Timeline and source
Published on 16 September 2022 and last revised on 20 May 2024. No public exploit is currently recorded for this entry. A vendor advisory or fix has been published. Record sourced from NVD.
References
github.com (Web)
nvd.nist.gov (Advisory)
github.com (Web)
github.com (Web)
github.com (Web)
github.com (Web)
github.com (Package)
github.com (Web)
pkg.go.dev (Web)
Details
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
Affected Packages
| Software | From version | Fixed in |
|---|---|---|
| github.com/open-policy-agent/opa | — | — |
| open-policy-agent | 0.40.0 | 0.43.1 |
References
Similar Threats
- High CVE-2026-26205
- High CVE-2025-46569
- Medium CVE-2024-8260
- High CVE-2022-33082
- High CVE-2022-28946
Site Security Check
Is open-policy-agent part of your stack?
CVE-2022-36085 is rated CVSS 8.0 High. BotEraser scans your installation against known CVE records and tells you whether this vulnerability applies to the versions you actually run.
Scan My Site Free →No credit card required · Results in minutes
ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.