Security: codion-is/codion

Security

SECURITY.md

Security Policy

Supported versions

Codion is in its final API refinement phase before its 1.0 promotion. Security fixes are applied to the latest released version. Until promotion, there is no long-term support branch — please track the most recent release.

Reporting a vulnerability

Please report security vulnerabilities privately, not via public issues.

Please include the affected version, the deployment configuration (transport, filter configuration, authentication), and a reproduction or proof of concept if available. You will receive an acknowledgement, and a fix or mitigation will be coordinated before any public disclosure.

Codion is open-source but not open-contribution — please report the issue rather than opening a pull request.

Security model

Codion is a framework for building internal business and scientific applications, typically serving 1–10 users (and capable of thousands) on a trusted network. Its security model reflects that deployment context.

  • Authentication & authorization are delegated to the database by default. Codion does not implement its own user store; access control is enforced by database roles (e.g. a read-only role and a read-write role). An application may add an Authenticator to perform additional checks at connection time.
  • The server is intended to run on a trusted network (behind a VPN for remote access). It is not designed to be exposed directly to the public internet.
  • Transport is encrypted by default. Both the RMI transport (codion.server.connection.sslEnabled, default true) and the HTTP transport (codion.server.http.secure, default true) use SSL/TLS out of the box.

Java deserialization

Codion supports remote connections over RMI and over HTTP. The RMI transport and the optional serialization-based HTTP transport exchange Java-serialized objects, which means they perform Java deserialization of data received from clients. This is the relevant attack surface for deserialization vulnerabilities, and Codion is designed to be safe by default against it.

Defenses, and what they mean for a default deployment

  1. JSON is the default HTTP transport; Java serialization over HTTP is opt-in.codion.server.http.json defaults to true and codion.server.http.serialization defaults to false. The serialization endpoints — and therefore every server-side readObject() on an HTTP request body — are only registered when an operator explicitly enables them. The JSON transport performs no Java deserialization of request bodies.

  2. A deserialization filter is mandatory by default. The server configures a JVM-wide ObjectInputFilter (JEP 290) from a configured ObjectInputFilterFactory, and codion.server.objectInputFilterFactoryRequired defaults to true. If no filter factory is configured, the server refuses to start. This filter applies to all deserialization in the process, covering both the RMI transport and the serialization-based HTTP transport. Disabling the requirement is an explicit, documented, non-default action (...objectInputFilterFactoryRequired=false, "not recommended for production").

  3. Resource-exhaustion limits. The built-in SerializationFilterFactory prepends JEP 290 resource limits (maxbytes, maxarray, maxdepth, maxrefs) enforced during deserialization, defending against deserialization-bomb / resource-exhaustion attacks regardless of class-level filtering.

As a result, reaching an unfiltered server-side deserialization requires an operator to take deliberate, non-default actions — for example, enabling the serialization HTTP transport and either disabling the mandatory filter or configuring a deliberately permissive filter. A stock deployment does not expose an unfiltered deserialization path.

Why there is no hard-coded allowlist

Codion deserializes application domain objects — the values carried by Entity attributes can be anySerializable type a given domain defines (custom value objects, enums, temporal types, numeric types, records, and so on). The framework cannot know these types at compile time, so a fixed, framework-supplied class allowlist would break legitimate applications. Codion therefore delegates the allowlist to the deployer, who knows their domain, while guaranteeing that some filter must be present before the server will run.

The framework provides tooling to make building that allowlist straightforward: a serialization filter dry-run mode records every class deserialized during a representative run and writes it to a file that can be used directly as the filter's pattern file.

Static-analysis note

Static analysis tools (e.g. CodeQL's "Deserialization of user-controlled data") flag the readObject() call in framework/servlet/src/main/java/is/codion/framework/servlet/EntityService.java. This is a known finding. The call is on the opt-in serialization HTTP transport (disabled by default) and is governed by the mandatory JVM-wide ObjectInputFilter described above. The deployment-side mitigation is the configured deserialization filter; see the source comment at the call site and the configuration guide below.

Hardening checklist

For production deployments:

  • Prefer the JSON transport (codion.server.http.json=true, codion.server.http.serialization=false, both default) unless you specifically need Java serialization over HTTP on a trusted network.
  • Keep the filter requirement on (codion.server.objectInputFilterFactoryRequired=true, default) and configure an ObjectInputFilterFactory — typically the built-in is.codion.common.rmi.server.SerializationFilterFactory with a whitelist built via the dry-run workflow.
  • Keep the resource-exhaustion limits at sensible values for your payloads.
  • Keep SSL/TLS enabled for the RMI and HTTP transports (both default true).
  • Run the server on a trusted network / behind a VPN; do not expose it directly to the public internet.
  • Use least-privilege database roles for application connections.

See documentation/src/docs/asciidoc/technical/server.adoc ("Serialization filtering") for the complete configuration reference, including pattern files, resource limits, and the dry-run workflow.

There aren't any published security advisories

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Security: codion-is/codion

Security

SECURITY.md

Security Policy

Supported versions

Codion is in its final API refinement phase before its 1.0 promotion. Security fixes are applied to the latest released version. Until promotion, there is no long-term support branch — please track the most recent release.

Reporting a vulnerability

Please report security vulnerabilities privately, not via public issues.

Please include the affected version, the deployment configuration (transport, filter configuration, authentication), and a reproduction or proof of concept if available. You will receive an acknowledgement, and a fix or mitigation will be coordinated before any public disclosure.

Codion is open-source but not open-contribution — please report the issue rather than opening a pull request.

Security model

Codion is a framework for building internal business and scientific applications, typically serving 1–10 users (and capable of thousands) on a trusted network. Its security model reflects that deployment context.

  • Authentication & authorization are delegated to the database by default. Codion does not implement its own user store; access control is enforced by database roles (e.g. a read-only role and a read-write role). An application may add an Authenticator to perform additional checks at connection time.
  • The server is intended to run on a trusted network (behind a VPN for remote access). It is not designed to be exposed directly to the public internet.
  • Transport is encrypted by default. Both the RMI transport (codion.server.connection.sslEnabled, default true) and the HTTP transport (codion.server.http.secure, default true) use SSL/TLS out of the box.

Java deserialization

Codion supports remote connections over RMI and over HTTP. The RMI transport and the optional serialization-based HTTP transport exchange Java-serialized objects, which means they perform Java deserialization of data received from clients. This is the relevant attack surface for deserialization vulnerabilities, and Codion is designed to be safe by default against it.

Defenses, and what they mean for a default deployment

  1. JSON is the default HTTP transport; Java serialization over HTTP is opt-in.codion.server.http.json defaults to true and codion.server.http.serialization defaults to false. The serialization endpoints — and therefore every server-side readObject() on an HTTP request body — are only registered when an operator explicitly enables them. The JSON transport performs no Java deserialization of request bodies.

  2. A deserialization filter is mandatory by default. The server configures a JVM-wide ObjectInputFilter (JEP 290) from a configured ObjectInputFilterFactory, and codion.server.objectInputFilterFactoryRequired defaults to true. If no filter factory is configured, the server refuses to start. This filter applies to all deserialization in the process, covering both the RMI transport and the serialization-based HTTP transport. Disabling the requirement is an explicit, documented, non-default action (...objectInputFilterFactoryRequired=false, "not recommended for production").

  3. Resource-exhaustion limits. The built-in SerializationFilterFactory prepends JEP 290 resource limits (maxbytes, maxarray, maxdepth, maxrefs) enforced during deserialization, defending against deserialization-bomb / resource-exhaustion attacks regardless of class-level filtering.

As a result, reaching an unfiltered server-side deserialization requires an operator to take deliberate, non-default actions — for example, enabling the serialization HTTP transport and either disabling the mandatory filter or configuring a deliberately permissive filter. A stock deployment does not expose an unfiltered deserialization path.

Why there is no hard-coded allowlist

Codion deserializes application domain objects — the values carried by Entity attributes can be anySerializable type a given domain defines (custom value objects, enums, temporal types, numeric types, records, and so on). The framework cannot know these types at compile time, so a fixed, framework-supplied class allowlist would break legitimate applications. Codion therefore delegates the allowlist to the deployer, who knows their domain, while guaranteeing that some filter must be present before the server will run.

The framework provides tooling to make building that allowlist straightforward: a serialization filter dry-run mode records every class deserialized during a representative run and writes it to a file that can be used directly as the filter's pattern file.

Static-analysis note

Static analysis tools (e.g. CodeQL's "Deserialization of user-controlled data") flag the readObject() call in framework/servlet/src/main/java/is/codion/framework/servlet/EntityService.java. This is a known finding. The call is on the opt-in serialization HTTP transport (disabled by default) and is governed by the mandatory JVM-wide ObjectInputFilter described above. The deployment-side mitigation is the configured deserialization filter; see the source comment at the call site and the configuration guide below.

Hardening checklist

For production deployments:

  • Prefer the JSON transport (codion.server.http.json=true, codion.server.http.serialization=false, both default) unless you specifically need Java serialization over HTTP on a trusted network.
  • Keep the filter requirement on (codion.server.objectInputFilterFactoryRequired=true, default) and configure an ObjectInputFilterFactory — typically the built-in is.codion.common.rmi.server.SerializationFilterFactory with a whitelist built via the dry-run workflow.
  • Keep the resource-exhaustion limits at sensible values for your payloads.
  • Keep SSL/TLS enabled for the RMI and HTTP transports (both default true).
  • Run the server on a trusted network / behind a VPN; do not expose it directly to the public internet.
  • Use least-privilege database roles for application connections.

See documentation/src/docs/asciidoc/technical/server.adoc ("Serialization filtering") for the complete configuration reference, including pattern files, resource limits, and the dry-run workflow.

There aren't any published security advisories

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Security: codion-is/codion

Security

SECURITY.md

Security Policy

Supported versions

Codion is in its final API refinement phase before its 1.0 promotion. Security fixes are applied to the latest released version. Until promotion, there is no long-term support branch — please track the most recent release.

Reporting a vulnerability

Please report security vulnerabilities privately, not via public issues.

Please include the affected version, the deployment configuration (transport, filter configuration, authentication), and a reproduction or proof of concept if available. You will receive an acknowledgement, and a fix or mitigation will be coordinated before any public disclosure.

Codion is open-source but not open-contribution — please report the issue rather than opening a pull request.

Security model

Codion is a framework for building internal business and scientific applications, typically serving 1–10 users (and capable of thousands) on a trusted network. Its security model reflects that deployment context.

  • Authentication & authorization are delegated to the database by default. Codion does not implement its own user store; access control is enforced by database roles (e.g. a read-only role and a read-write role). An application may add an Authenticator to perform additional checks at connection time.
  • The server is intended to run on a trusted network (behind a VPN for remote access). It is not designed to be exposed directly to the public internet.
  • Transport is encrypted by default. Both the RMI transport (codion.server.connection.sslEnabled, default true) and the HTTP transport (codion.server.http.secure, default true) use SSL/TLS out of the box.

Java deserialization

Codion supports remote connections over RMI and over HTTP. The RMI transport and the optional serialization-based HTTP transport exchange Java-serialized objects, which means they perform Java deserialization of data received from clients. This is the relevant attack surface for deserialization vulnerabilities, and Codion is designed to be safe by default against it.

Defenses, and what they mean for a default deployment

  1. JSON is the default HTTP transport; Java serialization over HTTP is opt-in.codion.server.http.json defaults to true and codion.server.http.serialization defaults to false. The serialization endpoints — and therefore every server-side readObject() on an HTTP request body — are only registered when an operator explicitly enables them. The JSON transport performs no Java deserialization of request bodies.

  2. A deserialization filter is mandatory by default. The server configures a JVM-wide ObjectInputFilter (JEP 290) from a configured ObjectInputFilterFactory, and codion.server.objectInputFilterFactoryRequired defaults to true. If no filter factory is configured, the server refuses to start. This filter applies to all deserialization in the process, covering both the RMI transport and the serialization-based HTTP transport. Disabling the requirement is an explicit, documented, non-default action (...objectInputFilterFactoryRequired=false, "not recommended for production").

  3. Resource-exhaustion limits. The built-in SerializationFilterFactory prepends JEP 290 resource limits (maxbytes, maxarray, maxdepth, maxrefs) enforced during deserialization, defending against deserialization-bomb / resource-exhaustion attacks regardless of class-level filtering.

As a result, reaching an unfiltered server-side deserialization requires an operator to take deliberate, non-default actions — for example, enabling the serialization HTTP transport and either disabling the mandatory filter or configuring a deliberately permissive filter. A stock deployment does not expose an unfiltered deserialization path.

Why there is no hard-coded allowlist

Codion deserializes application domain objects — the values carried by Entity attributes can be anySerializable type a given domain defines (custom value objects, enums, temporal types, numeric types, records, and so on). The framework cannot know these types at compile time, so a fixed, framework-supplied class allowlist would break legitimate applications. Codion therefore delegates the allowlist to the deployer, who knows their domain, while guaranteeing that some filter must be present before the server will run.

The framework provides tooling to make building that allowlist straightforward: a serialization filter dry-run mode records every class deserialized during a representative run and writes it to a file that can be used directly as the filter's pattern file.

Static-analysis note

Static analysis tools (e.g. CodeQL's "Deserialization of user-controlled data") flag the readObject() call in framework/servlet/src/main/java/is/codion/framework/servlet/EntityService.java. This is a known finding. The call is on the opt-in serialization HTTP transport (disabled by default) and is governed by the mandatory JVM-wide ObjectInputFilter described above. The deployment-side mitigation is the configured deserialization filter; see the source comment at the call site and the configuration guide below.

Hardening checklist

For production deployments:

  • Prefer the JSON transport (codion.server.http.json=true, codion.server.http.serialization=false, both default) unless you specifically need Java serialization over HTTP on a trusted network.
  • Keep the filter requirement on (codion.server.objectInputFilterFactoryRequired=true, default) and configure an ObjectInputFilterFactory — typically the built-in is.codion.common.rmi.server.SerializationFilterFactory with a whitelist built via the dry-run workflow.
  • Keep the resource-exhaustion limits at sensible values for your payloads.
  • Keep SSL/TLS enabled for the RMI and HTTP transports (both default true).
  • Run the server on a trusted network / behind a VPN; do not expose it directly to the public internet.
  • Use least-privilege database roles for application connections.

See documentation/src/docs/asciidoc/technical/server.adoc ("Serialization filtering") for the complete configuration reference, including pattern files, resource limits, and the dry-run workflow.

There aren't any published security advisories

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Security: codion-is/codion

Security

SECURITY.md

Security Policy

Supported versions

Codion is in its final API refinement phase before its 1.0 promotion. Security fixes are applied to the latest released version. Until promotion, there is no long-term support branch — please track the most recent release.

Reporting a vulnerability

Please report security vulnerabilities privately, not via public issues.

Please include the affected version, the deployment configuration (transport, filter configuration, authentication), and a reproduction or proof of concept if available. You will receive an acknowledgement, and a fix or mitigation will be coordinated before any public disclosure.

Codion is open-source but not open-contribution — please report the issue rather than opening a pull request.

Security model

Codion is a framework for building internal business and scientific applications, typically serving 1–10 users (and capable of thousands) on a trusted network. Its security model reflects that deployment context.

  • Authentication & authorization are delegated to the database by default. Codion does not implement its own user store; access control is enforced by database roles (e.g. a read-only role and a read-write role). An application may add an Authenticator to perform additional checks at connection time.
  • The server is intended to run on a trusted network (behind a VPN for remote access). It is not designed to be exposed directly to the public internet.
  • Transport is encrypted by default. Both the RMI transport (codion.server.connection.sslEnabled, default true) and the HTTP transport (codion.server.http.secure, default true) use SSL/TLS out of the box.

Java deserialization

Codion supports remote connections over RMI and over HTTP. The RMI transport and the optional serialization-based HTTP transport exchange Java-serialized objects, which means they perform Java deserialization of data received from clients. This is the relevant attack surface for deserialization vulnerabilities, and Codion is designed to be safe by default against it.

Defenses, and what they mean for a default deployment

  1. JSON is the default HTTP transport; Java serialization over HTTP is opt-in.codion.server.http.json defaults to true and codion.server.http.serialization defaults to false. The serialization endpoints — and therefore every server-side readObject() on an HTTP request body — are only registered when an operator explicitly enables them. The JSON transport performs no Java deserialization of request bodies.

  2. A deserialization filter is mandatory by default. The server configures a JVM-wide ObjectInputFilter (JEP 290) from a configured ObjectInputFilterFactory, and codion.server.objectInputFilterFactoryRequired defaults to true. If no filter factory is configured, the server refuses to start. This filter applies to all deserialization in the process, covering both the RMI transport and the serialization-based HTTP transport. Disabling the requirement is an explicit, documented, non-default action (...objectInputFilterFactoryRequired=false, "not recommended for production").

  3. Resource-exhaustion limits. The built-in SerializationFilterFactory prepends JEP 290 resource limits (maxbytes, maxarray, maxdepth, maxrefs) enforced during deserialization, defending against deserialization-bomb / resource-exhaustion attacks regardless of class-level filtering.

As a result, reaching an unfiltered server-side deserialization requires an operator to take deliberate, non-default actions — for example, enabling the serialization HTTP transport and either disabling the mandatory filter or configuring a deliberately permissive filter. A stock deployment does not expose an unfiltered deserialization path.

Why there is no hard-coded allowlist

Codion deserializes application domain objects — the values carried by Entity attributes can be anySerializable type a given domain defines (custom value objects, enums, temporal types, numeric types, records, and so on). The framework cannot know these types at compile time, so a fixed, framework-supplied class allowlist would break legitimate applications. Codion therefore delegates the allowlist to the deployer, who knows their domain, while guaranteeing that some filter must be present before the server will run.

The framework provides tooling to make building that allowlist straightforward: a serialization filter dry-run mode records every class deserialized during a representative run and writes it to a file that can be used directly as the filter's pattern file.

Static-analysis note

Static analysis tools (e.g. CodeQL's "Deserialization of user-controlled data") flag the readObject() call in framework/servlet/src/main/java/is/codion/framework/servlet/EntityService.java. This is a known finding. The call is on the opt-in serialization HTTP transport (disabled by default) and is governed by the mandatory JVM-wide ObjectInputFilter described above. The deployment-side mitigation is the configured deserialization filter; see the source comment at the call site and the configuration guide below.

Hardening checklist

For production deployments:

  • Prefer the JSON transport (codion.server.http.json=true, codion.server.http.serialization=false, both default) unless you specifically need Java serialization over HTTP on a trusted network.
  • Keep the filter requirement on (codion.server.objectInputFilterFactoryRequired=true, default) and configure an ObjectInputFilterFactory — typically the built-in is.codion.common.rmi.server.SerializationFilterFactory with a whitelist built via the dry-run workflow.
  • Keep the resource-exhaustion limits at sensible values for your payloads.
  • Keep SSL/TLS enabled for the RMI and HTTP transports (both default true).
  • Run the server on a trusted network / behind a VPN; do not expose it directly to the public internet.
  • Use least-privilege database roles for application connections.

See documentation/src/docs/asciidoc/technical/server.adoc ("Serialization filtering") for the complete configuration reference, including pattern files, resource limits, and the dry-run workflow.

There aren't any published security advisories

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Security: codion-is/codion

Security

SECURITY.md

Security Policy

Supported versions

Codion is in its final API refinement phase before its 1.0 promotion. Security fixes are applied to the latest released version. Until promotion, there is no long-term support branch — please track the most recent release.

Reporting a vulnerability

Please report security vulnerabilities privately, not via public issues.

Please include the affected version, the deployment configuration (transport, filter configuration, authentication), and a reproduction or proof of concept if available. You will receive an acknowledgement, and a fix or mitigation will be coordinated before any public disclosure.

Codion is open-source but not open-contribution — please report the issue rather than opening a pull request.

Security model

Codion is a framework for building internal business and scientific applications, typically serving 1–10 users (and capable of thousands) on a trusted network. Its security model reflects that deployment context.

  • Authentication & authorization are delegated to the database by default. Codion does not implement its own user store; access control is enforced by database roles (e.g. a read-only role and a read-write role). An application may add an Authenticator to perform additional checks at connection time.
  • The server is intended to run on a trusted network (behind a VPN for remote access). It is not designed to be exposed directly to the public internet.
  • Transport is encrypted by default. Both the RMI transport (codion.server.connection.sslEnabled, default true) and the HTTP transport (codion.server.http.secure, default true) use SSL/TLS out of the box.

Java deserialization

Codion supports remote connections over RMI and over HTTP. The RMI transport and the optional serialization-based HTTP transport exchange Java-serialized objects, which means they perform Java deserialization of data received from clients. This is the relevant attack surface for deserialization vulnerabilities, and Codion is designed to be safe by default against it.

Defenses, and what they mean for a default deployment

  1. JSON is the default HTTP transport; Java serialization over HTTP is opt-in.codion.server.http.json defaults to true and codion.server.http.serialization defaults to false. The serialization endpoints — and therefore every server-side readObject() on an HTTP request body — are only registered when an operator explicitly enables them. The JSON transport performs no Java deserialization of request bodies.

  2. A deserialization filter is mandatory by default. The server configures a JVM-wide ObjectInputFilter (JEP 290) from a configured ObjectInputFilterFactory, and codion.server.objectInputFilterFactoryRequired defaults to true. If no filter factory is configured, the server refuses to start. This filter applies to all deserialization in the process, covering both the RMI transport and the serialization-based HTTP transport. Disabling the requirement is an explicit, documented, non-default action (...objectInputFilterFactoryRequired=false, "not recommended for production").

  3. Resource-exhaustion limits. The built-in SerializationFilterFactory prepends JEP 290 resource limits (maxbytes, maxarray, maxdepth, maxrefs) enforced during deserialization, defending against deserialization-bomb / resource-exhaustion attacks regardless of class-level filtering.

As a result, reaching an unfiltered server-side deserialization requires an operator to take deliberate, non-default actions — for example, enabling the serialization HTTP transport and either disabling the mandatory filter or configuring a deliberately permissive filter. A stock deployment does not expose an unfiltered deserialization path.

Why there is no hard-coded allowlist

Codion deserializes application domain objects — the values carried by Entity attributes can be anySerializable type a given domain defines (custom value objects, enums, temporal types, numeric types, records, and so on). The framework cannot know these types at compile time, so a fixed, framework-supplied class allowlist would break legitimate applications. Codion therefore delegates the allowlist to the deployer, who knows their domain, while guaranteeing that some filter must be present before the server will run.

The framework provides tooling to make building that allowlist straightforward: a serialization filter dry-run mode records every class deserialized during a representative run and writes it to a file that can be used directly as the filter's pattern file.

Static-analysis note

Static analysis tools (e.g. CodeQL's "Deserialization of user-controlled data") flag the readObject() call in framework/servlet/src/main/java/is/codion/framework/servlet/EntityService.java. This is a known finding. The call is on the opt-in serialization HTTP transport (disabled by default) and is governed by the mandatory JVM-wide ObjectInputFilter described above. The deployment-side mitigation is the configured deserialization filter; see the source comment at the call site and the configuration guide below.

Hardening checklist

For production deployments:

  • Prefer the JSON transport (codion.server.http.json=true, codion.server.http.serialization=false, both default) unless you specifically need Java serialization over HTTP on a trusted network.
  • Keep the filter requirement on (codion.server.objectInputFilterFactoryRequired=true, default) and configure an ObjectInputFilterFactory — typically the built-in is.codion.common.rmi.server.SerializationFilterFactory with a whitelist built via the dry-run workflow.
  • Keep the resource-exhaustion limits at sensible values for your payloads.
  • Keep SSL/TLS enabled for the RMI and HTTP transports (both default true).
  • Run the server on a trusted network / behind a VPN; do not expose it directly to the public internet.
  • Use least-privilege database roles for application connections.

See documentation/src/docs/asciidoc/technical/server.adoc ("Serialization filtering") for the complete configuration reference, including pattern files, resource limits, and the dry-run workflow.

There aren't any published security advisories

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Security: codion-is/codion

Security

SECURITY.md

Security Policy

Supported versions

Codion is in its final API refinement phase before its 1.0 promotion. Security fixes are applied to the latest released version. Until promotion, there is no long-term support branch — please track the most recent release.

Reporting a vulnerability

Please report security vulnerabilities privately, not via public issues.

Please include the affected version, the deployment configuration (transport, filter configuration, authentication), and a reproduction or proof of concept if available. You will receive an acknowledgement, and a fix or mitigation will be coordinated before any public disclosure.

Codion is open-source but not open-contribution — please report the issue rather than opening a pull request.

Security model

Codion is a framework for building internal business and scientific applications, typically serving 1–10 users (and capable of thousands) on a trusted network. Its security model reflects that deployment context.

  • Authentication & authorization are delegated to the database by default. Codion does not implement its own user store; access control is enforced by database roles (e.g. a read-only role and a read-write role). An application may add an Authenticator to perform additional checks at connection time.
  • The server is intended to run on a trusted network (behind a VPN for remote access). It is not designed to be exposed directly to the public internet.
  • Transport is encrypted by default. Both the RMI transport (codion.server.connection.sslEnabled, default true) and the HTTP transport (codion.server.http.secure, default true) use SSL/TLS out of the box.

Java deserialization

Codion supports remote connections over RMI and over HTTP. The RMI transport and the optional serialization-based HTTP transport exchange Java-serialized objects, which means they perform Java deserialization of data received from clients. This is the relevant attack surface for deserialization vulnerabilities, and Codion is designed to be safe by default against it.

Defenses, and what they mean for a default deployment

  1. JSON is the default HTTP transport; Java serialization over HTTP is opt-in.codion.server.http.json defaults to true and codion.server.http.serialization defaults to false. The serialization endpoints — and therefore every server-side readObject() on an HTTP request body — are only registered when an operator explicitly enables them. The JSON transport performs no Java deserialization of request bodies.

  2. A deserialization filter is mandatory by default. The server configures a JVM-wide ObjectInputFilter (JEP 290) from a configured ObjectInputFilterFactory, and codion.server.objectInputFilterFactoryRequired defaults to true. If no filter factory is configured, the server refuses to start. This filter applies to all deserialization in the process, covering both the RMI transport and the serialization-based HTTP transport. Disabling the requirement is an explicit, documented, non-default action (...objectInputFilterFactoryRequired=false, "not recommended for production").

  3. Resource-exhaustion limits. The built-in SerializationFilterFactory prepends JEP 290 resource limits (maxbytes, maxarray, maxdepth, maxrefs) enforced during deserialization, defending against deserialization-bomb / resource-exhaustion attacks regardless of class-level filtering.

As a result, reaching an unfiltered server-side deserialization requires an operator to take deliberate, non-default actions — for example, enabling the serialization HTTP transport and either disabling the mandatory filter or configuring a deliberately permissive filter. A stock deployment does not expose an unfiltered deserialization path.

Why there is no hard-coded allowlist

Codion deserializes application domain objects — the values carried by Entity attributes can be anySerializable type a given domain defines (custom value objects, enums, temporal types, numeric types, records, and so on). The framework cannot know these types at compile time, so a fixed, framework-supplied class allowlist would break legitimate applications. Codion therefore delegates the allowlist to the deployer, who knows their domain, while guaranteeing that some filter must be present before the server will run.

The framework provides tooling to make building that allowlist straightforward: a serialization filter dry-run mode records every class deserialized during a representative run and writes it to a file that can be used directly as the filter's pattern file.

Static-analysis note

Static analysis tools (e.g. CodeQL's "Deserialization of user-controlled data") flag the readObject() call in framework/servlet/src/main/java/is/codion/framework/servlet/EntityService.java. This is a known finding. The call is on the opt-in serialization HTTP transport (disabled by default) and is governed by the mandatory JVM-wide ObjectInputFilter described above. The deployment-side mitigation is the configured deserialization filter; see the source comment at the call site and the configuration guide below.

Hardening checklist

For production deployments:

  • Prefer the JSON transport (codion.server.http.json=true, codion.server.http.serialization=false, both default) unless you specifically need Java serialization over HTTP on a trusted network.
  • Keep the filter requirement on (codion.server.objectInputFilterFactoryRequired=true, default) and configure an ObjectInputFilterFactory — typically the built-in is.codion.common.rmi.server.SerializationFilterFactory with a whitelist built via the dry-run workflow.
  • Keep the resource-exhaustion limits at sensible values for your payloads.
  • Keep SSL/TLS enabled for the RMI and HTTP transports (both default true).
  • Run the server on a trusted network / behind a VPN; do not expose it directly to the public internet.
  • Use least-privilege database roles for application connections.

See documentation/src/docs/asciidoc/technical/server.adoc ("Serialization filtering") for the complete configuration reference, including pattern files, resource limits, and the dry-run workflow.

There aren't any published security advisories

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Security: codion-is/codion

Security

SECURITY.md

Security Policy

Supported versions

Codion is in its final API refinement phase before its 1.0 promotion. Security fixes are applied to the latest released version. Until promotion, there is no long-term support branch — please track the most recent release.

Reporting a vulnerability

Please report security vulnerabilities privately, not via public issues.

Please include the affected version, the deployment configuration (transport, filter configuration, authentication), and a reproduction or proof of concept if available. You will receive an acknowledgement, and a fix or mitigation will be coordinated before any public disclosure.

Codion is open-source but not open-contribution — please report the issue rather than opening a pull request.

Security model

Codion is a framework for building internal business and scientific applications, typically serving 1–10 users (and capable of thousands) on a trusted network. Its security model reflects that deployment context.

  • Authentication & authorization are delegated to the database by default. Codion does not implement its own user store; access control is enforced by database roles (e.g. a read-only role and a read-write role). An application may add an Authenticator to perform additional checks at connection time.
  • The server is intended to run on a trusted network (behind a VPN for remote access). It is not designed to be exposed directly to the public internet.
  • Transport is encrypted by default. Both the RMI transport (codion.server.connection.sslEnabled, default true) and the HTTP transport (codion.server.http.secure, default true) use SSL/TLS out of the box.

Java deserialization

Codion supports remote connections over RMI and over HTTP. The RMI transport and the optional serialization-based HTTP transport exchange Java-serialized objects, which means they perform Java deserialization of data received from clients. This is the relevant attack surface for deserialization vulnerabilities, and Codion is designed to be safe by default against it.

Defenses, and what they mean for a default deployment

  1. JSON is the default HTTP transport; Java serialization over HTTP is opt-in.codion.server.http.json defaults to true and codion.server.http.serialization defaults to false. The serialization endpoints — and therefore every server-side readObject() on an HTTP request body — are only registered when an operator explicitly enables them. The JSON transport performs no Java deserialization of request bodies.

  2. A deserialization filter is mandatory by default. The server configures a JVM-wide ObjectInputFilter (JEP 290) from a configured ObjectInputFilterFactory, and codion.server.objectInputFilterFactoryRequired defaults to true. If no filter factory is configured, the server refuses to start. This filter applies to all deserialization in the process, covering both the RMI transport and the serialization-based HTTP transport. Disabling the requirement is an explicit, documented, non-default action (...objectInputFilterFactoryRequired=false, "not recommended for production").

  3. Resource-exhaustion limits. The built-in SerializationFilterFactory prepends JEP 290 resource limits (maxbytes, maxarray, maxdepth, maxrefs) enforced during deserialization, defending against deserialization-bomb / resource-exhaustion attacks regardless of class-level filtering.

As a result, reaching an unfiltered server-side deserialization requires an operator to take deliberate, non-default actions — for example, enabling the serialization HTTP transport and either disabling the mandatory filter or configuring a deliberately permissive filter. A stock deployment does not expose an unfiltered deserialization path.

Why there is no hard-coded allowlist

Codion deserializes application domain objects — the values carried by Entity attributes can be anySerializable type a given domain defines (custom value objects, enums, temporal types, numeric types, records, and so on). The framework cannot know these types at compile time, so a fixed, framework-supplied class allowlist would break legitimate applications. Codion therefore delegates the allowlist to the deployer, who knows their domain, while guaranteeing that some filter must be present before the server will run.

The framework provides tooling to make building that allowlist straightforward: a serialization filter dry-run mode records every class deserialized during a representative run and writes it to a file that can be used directly as the filter's pattern file.

Static-analysis note

Static analysis tools (e.g. CodeQL's "Deserialization of user-controlled data") flag the readObject() call in framework/servlet/src/main/java/is/codion/framework/servlet/EntityService.java. This is a known finding. The call is on the opt-in serialization HTTP transport (disabled by default) and is governed by the mandatory JVM-wide ObjectInputFilter described above. The deployment-side mitigation is the configured deserialization filter; see the source comment at the call site and the configuration guide below.

Hardening checklist

For production deployments:

  • Prefer the JSON transport (codion.server.http.json=true, codion.server.http.serialization=false, both default) unless you specifically need Java serialization over HTTP on a trusted network.
  • Keep the filter requirement on (codion.server.objectInputFilterFactoryRequired=true, default) and configure an ObjectInputFilterFactory — typically the built-in is.codion.common.rmi.server.SerializationFilterFactory with a whitelist built via the dry-run workflow.
  • Keep the resource-exhaustion limits at sensible values for your payloads.
  • Keep SSL/TLS enabled for the RMI and HTTP transports (both default true).
  • Run the server on a trusted network / behind a VPN; do not expose it directly to the public internet.
  • Use least-privilege database roles for application connections.

See documentation/src/docs/asciidoc/technical/server.adoc ("Serialization filtering") for the complete configuration reference, including pattern files, resource limits, and the dry-run workflow.

There aren't any published security advisories

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Security: codion-is/codion

Security

SECURITY.md

Security Policy

Supported versions

Codion is in its final API refinement phase before its 1.0 promotion. Security fixes are applied to the latest released version. Until promotion, there is no long-term support branch — please track the most recent release.

Reporting a vulnerability

Please report security vulnerabilities privately, not via public issues.

Please include the affected version, the deployment configuration (transport, filter configuration, authentication), and a reproduction or proof of concept if available. You will receive an acknowledgement, and a fix or mitigation will be coordinated before any public disclosure.

Codion is open-source but not open-contribution — please report the issue rather than opening a pull request.

Security model

Codion is a framework for building internal business and scientific applications, typically serving 1–10 users (and capable of thousands) on a trusted network. Its security model reflects that deployment context.

  • Authentication & authorization are delegated to the database by default. Codion does not implement its own user store; access control is enforced by database roles (e.g. a read-only role and a read-write role). An application may add an Authenticator to perform additional checks at connection time.
  • The server is intended to run on a trusted network (behind a VPN for remote access). It is not designed to be exposed directly to the public internet.
  • Transport is encrypted by default. Both the RMI transport (codion.server.connection.sslEnabled, default true) and the HTTP transport (codion.server.http.secure, default true) use SSL/TLS out of the box.

Java deserialization

Codion supports remote connections over RMI and over HTTP. The RMI transport and the optional serialization-based HTTP transport exchange Java-serialized objects, which means they perform Java deserialization of data received from clients. This is the relevant attack surface for deserialization vulnerabilities, and Codion is designed to be safe by default against it.

Defenses, and what they mean for a default deployment

  1. JSON is the default HTTP transport; Java serialization over HTTP is opt-in.codion.server.http.json defaults to true and codion.server.http.serialization defaults to false. The serialization endpoints — and therefore every server-side readObject() on an HTTP request body — are only registered when an operator explicitly enables them. The JSON transport performs no Java deserialization of request bodies.

  2. A deserialization filter is mandatory by default. The server configures a JVM-wide ObjectInputFilter (JEP 290) from a configured ObjectInputFilterFactory, and codion.server.objectInputFilterFactoryRequired defaults to true. If no filter factory is configured, the server refuses to start. This filter applies to all deserialization in the process, covering both the RMI transport and the serialization-based HTTP transport. Disabling the requirement is an explicit, documented, non-default action (...objectInputFilterFactoryRequired=false, "not recommended for production").

  3. Resource-exhaustion limits. The built-in SerializationFilterFactory prepends JEP 290 resource limits (maxbytes, maxarray, maxdepth, maxrefs) enforced during deserialization, defending against deserialization-bomb / resource-exhaustion attacks regardless of class-level filtering.

As a result, reaching an unfiltered server-side deserialization requires an operator to take deliberate, non-default actions — for example, enabling the serialization HTTP transport and either disabling the mandatory filter or configuring a deliberately permissive filter. A stock deployment does not expose an unfiltered deserialization path.

Why there is no hard-coded allowlist

Codion deserializes application domain objects — the values carried by Entity attributes can be anySerializable type a given domain defines (custom value objects, enums, temporal types, numeric types, records, and so on). The framework cannot know these types at compile time, so a fixed, framework-supplied class allowlist would break legitimate applications. Codion therefore delegates the allowlist to the deployer, who knows their domain, while guaranteeing that some filter must be present before the server will run.

The framework provides tooling to make building that allowlist straightforward: a serialization filter dry-run mode records every class deserialized during a representative run and writes it to a file that can be used directly as the filter's pattern file.

Static-analysis note

Static analysis tools (e.g. CodeQL's "Deserialization of user-controlled data") flag the readObject() call in framework/servlet/src/main/java/is/codion/framework/servlet/EntityService.java. This is a known finding. The call is on the opt-in serialization HTTP transport (disabled by default) and is governed by the mandatory JVM-wide ObjectInputFilter described above. The deployment-side mitigation is the configured deserialization filter; see the source comment at the call site and the configuration guide below.

Hardening checklist

For production deployments:

  • Prefer the JSON transport (codion.server.http.json=true, codion.server.http.serialization=false, both default) unless you specifically need Java serialization over HTTP on a trusted network.
  • Keep the filter requirement on (codion.server.objectInputFilterFactoryRequired=true, default) and configure an ObjectInputFilterFactory — typically the built-in is.codion.common.rmi.server.SerializationFilterFactory with a whitelist built via the dry-run workflow.
  • Keep the resource-exhaustion limits at sensible values for your payloads.
  • Keep SSL/TLS enabled for the RMI and HTTP transports (both default true).
  • Run the server on a trusted network / behind a VPN; do not expose it directly to the public internet.
  • Use least-privilege database roles for application connections.

See documentation/src/docs/asciidoc/technical/server.adoc ("Serialization filtering") for the complete configuration reference, including pattern files, resource limits, and the dry-run workflow.

There aren't any published security advisories