OWASP_Application_Security_Verification_Standard_4.0 - scriptCode
Remote service calls
Treat any parameters entering the ScriptCode as untrusted when sending to services
In practice this means that you must strictly follow the API rules provided by the REST client. Among other things it defines how to construct the path as a list of individual address segments. Such an interface may seem unintuitive, but it provides greater security.
Sample code
Wrong:
const url = "/api/form/" + context.getFirstParameter("form_id") + "/data";
const response = api.rest.v1.get("host", {pathParams: url.split("/")});Right:
const pathParams = ["api", "form", context.getFirstParameter("form_id"), "data"];
const response = api.rest.v1.get("host", {pathParams: pathParms});Handling authorization data for services
Authorization data should never be used directly in ScriptCode. When calling external services (e.g. via api.rest.v1) the platform is responsible for setting the appropriate authorization data in the request to the service. If this is not supported for a given service, a request should be submitted to the PO. For services where implementation is technically impossible or will be time-consuming, consult developers on how to securely provide the authorization data. Regardless of the approach taken, you must absolutely avoid storing authorization data (in code, session variables, process variables, form fields) and sending it to the frontend (form fields — including technical fields, session variables).
How to recognize problematic data? Unfortunately, due to the variety of authentication methods it is difficult to present a complete list of such data — use common sense and pay special attention to data that grants access to services. Below is a short list of terms to help you identify such data — if you encounter them be alert:
login/username and password,
token,
key,
Authorization header,
API key,
API token,
bearer token,
JWT token.
Retrieving remote resources
All resources we use (e.g.: images, documents, card images, etc.) should come from a trusted source. Most often that source is the eximee platform itself or some banking resource, but it should never be the internet. In most cases eximee restricts the ability to use resources only to trusted ones (e.g.: in the REST service client you can refer only to services defined by the administrator), however there may be places where such a restriction is not implemented (or cannot be implemented). Each time you want to use an external source in the application (in practice some URL) you should verify whether it is a trusted source (comes from the bank's domain, arrived in the requirements) — if the source is not trusted consult its use with the PO. It is unacceptable to use external services to implement functionality that the platform does not provide — in such cases you should request that functionality.
If you must use any link in the application make sure it is trusted and its use follows directly from the requirements
If some functionality is missing in the platform report the need - do not use external tools
Sensitive data
Use a sensitive logger for logging sensitive data
Sample code
New loggers (preferred method):
New loggers by default treat every passed parameter as sensitive data. To change this behavior you must explicitly use nonsensitive on the parameter. Additionally new loggers allow placing parameters in a text template (we do not concatenate like with the old loggers).
Wrong:
const pesel = context.getFirstParameter("pesel");
// 1.
Logger.info("Customer's pesel filled in on the form: {}", nonsensitive(pesel));
// 2.
Logger.info("Customer's pesel filled in on the form: " + pesel);Right:
const pesel = context.getFirstParameter("pesel");
Logger.info("Customer's pesel filled in on the form: {}", pesel)Last updated
Was this helpful?
