OPA Compiler: Bypass of WithUnsafeBuiltins using "with" keyword to mock functions
Date: 2022-09
Affected: go/github.com/open-policy-agent/opa
Attack vector: info-disclosure
Category: vulnerability-disclosure
Severity: High
CVE: CVE-2022-36085
CWE: CWE-20
CVSS: 7.4 (CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N)

### 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 se


Mitigations:

Architectural layers (MAESTRO):