This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
mobilecritical PriorityID: kmp-secure-native-memory-zeroization-standard

Kotlin Multiplatform Deterministic Cryptographic Memory Zeroization Guardrail

Enforces deterministic cryptographic key and biometric token zeroization across Android ART and iOS native runtimes. Mandates pinned, off-heap, or mutable byte buffer allocations purged via volatile compiler-barrier memory wiping immediately after use to eliminate retention in swap space, core dumps, or compacting garbage collection passes.

Prohibited Anti-Pattern: Leaking Ephemeral Cryptographic Secrets to Unmanaged GC Heaps via Immutable Strings or Unscrubbed ByteArrays

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Kotlin Multiplatform Deterministic Cryptographic Memory Zeroization Guardrail - Enforces deterministic cryptographic key and biometric token zeroization across Android ART and iOS native runtimes. Mandates pinned, off-heap, or mutable byte buffer allocations purged via volatile compiler-barrier memory wiping immediately after use to eliminate retention in swap space, core dumps, or compacting garbage collection passes.
globs: **/crypto/**/*.kt, **/security/**/*.kt, **/auth/**/*.kt, **/commonMain/**/*.kt, **/androidMain/**/*.kt, **/iosMain/**/*.kt
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/kmp-secure-native-memory-zeroization-standard"
---

# Kotlin Multiplatform Deterministic Cryptographic Memory Zeroization Guardrail

> **Severity**: CRITICAL | **Category**: mobile
> **Anti-Pattern Warning**: Leaking Ephemeral Cryptographic Secrets to Unmanaged GC Heaps via Immutable Strings or Unscrubbed ByteArrays

## System Constraints
You are a Principal Security and Systems Architect enforcing the Kotlin Multiplatform (KMP) Secure Native Memory Zeroization Standard. Cryptographic keys, biometric session tokens, and raw private credentials must never enter garbage-collected generational heaps via immutable structures like java.lang.String or unpinned Kotlin ByteArrays. You must mandate strict deterministic memory lifecycle management using scoped closures, platform-specific secure wipe primitives (memset_s on Darwin/iOS and JNI direct buffer volatile-wiping on Android), and compiler dead-store elimination defenses.

## Strict Guidelines
- Engineers MUST ALWAYS encapsulate raw cryptographic keys, biometric payloads, and plaintexts in a scoped AutoCloseable/Closeable resource (e.g., SecureBytes) and consume them strictly through scoped blocks (`use { ... }`).
- Engineers MUST NOT represent cryptographic secrets as `String`, `CharSequence`, or immutable boxed collections, as JVM String interning and Kotlin/Native immutability prevent memory overwriting.
- Code SHOULD allocate memory for secret materials using pinned native memory (iOS Kotlin Native `Arena` / `posix.memset_s`) or off-heap DirectByteBuffers on Android to evade GC compaction copies.
- Services MUST execute dead-store resistant zeroization (such as `memset_s`, `SecureZeroMemory`, or explicit volatile iteration) before releasing memory buffers back to the OS or allocator.
- Components NEVER expose unzeroed ByteArrays across module or FFI boundaries without explicit ownership transfer and caller-cleanup contracts.

## Bad vs Good Implementations
### KMP Secure Cryptographic Secret Lifecycle with Deterministic Zeroization

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Strings are immutable across both JVM and Apple targets, remaining readable in memory dumps indefinitely. Standard ByteArrays allocated on the managed heap cannot guarantee immediate zeroing, are subject to GC compaction duplicating sensitive bytes in memory, and the compiler may optimize away post-use zero-loops as dead-store elimination.
```kotlin
// Anti-Pattern: Secret kept in immutable String and unmanaged ByteArray
// String cannot be mutated or zeroed; ByteArray survives in GC heap until collection/compaction
class KeyManager {
    fun decryptToken(rawSecretString: String, encryptedPayload: ByteArray): ByteArray {
        val keyBytes = rawSecretString.encodeToByteArray() // Heap leak 1: String is immutable
        val cipher = initializePlatformCipher(keyBytes)   // Heap leak 2: ByteArray left unscrubbed
        return cipher.doFinal(encryptedPayload)
    }
}
```

#### Production Standard (Correct)
> **Standard**: The secret is encapsulated in a native memory container pinned outside standard generational GC compaction passes. The `useSecret` scope guarantees deterministic purging via `close()`, which delegates to native platform zeroization functions (`memset_s` on iOS and direct JNI volatile-fills on Android), neutralizing compiler dead-store elimination.
```kotlin
// Production Guardrail: Expect/Actual scoped zeroization with dead-store prevention
expect class NativeSecretBuffer(capacity: Int) : AutoCloseable {
    val size: Int
    fun write(source: ByteArray)
    fun read(destination: ByteArray)
    override fun close() // Enforces platform memset_s / volatile overwrite
}

inline fun <R> NativeSecretBuffer.useSecret(block: (NativeSecretBuffer) -> R): R {
    return try {
        block(this)
    } finally {
        this.close()
    }
}

// Usage within business logic
class KeyManager {
    fun decryptToken(secretInput: ByteArray, encryptedPayload: ByteArray): ByteArray {
        val buffer = NativeSecretBuffer(secretInput.size)
        return buffer.useSecret { secureKey ->
            secureKey.write(secretInput)
            // Execute platform cipher using memory pointer / direct reference
            executeCryptoOperation(secureKey, encryptedPayload)
        } // NativeSecretBuffer.close() invokes volatile wipe / memset_s immediately
    }
}
```

Recommended MCP Servers (mcp-serverlist.com)

Equip agent with system tools to verify code for this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Kotlin Multiplatform Deterministic Cryptographic Memory Zeroization Guardrail

Kotlin Multiplatform Deterministic Cryptographic Memory Zeroization Guardrail defines an industrial-grade behavioral standard for mobile engineering. Enforces deterministic cryptographic key and biometric token zeroization across Android ART and iOS native runtimes. Mandates pinned, off-heap, or mutable byte buffer allocations purged via volatile compiler-barrier memory wiping immediately after use to eliminate retention in swap space, core dumps, or compacting garbage collection passes. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.

Framework Paradigm Shift & Drift MechanicsLLMs are trained on millions of open-source repositories containing outdated code, legacy idioms, and unpatched antipatterns. When coding assistants generate implementations for this stack, they default to common statistical tokens: Leaking Ephemeral Cryptographic Secrets to Unmanaged GC Heaps via Immutable Strings or Unscrubbed ByteArrays Without an explicit system instruction file, developers spend hours debugging silent failures.
Failure Modes & Production Blast Radius

Hazard Analysis: What Breaks Without This Rule

The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:

Failure ModeAI Symptom (The Anti-Pattern)SeverityProduction Impact & Remedy
AI Hallucination & Deprecation DriftLeaking Ephemeral Cryptographic Secrets to Unmanaged GC Heaps via Immutable Strings or Unscrubbed ByteArraysCritical
Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production.
Enforce explicit behavioral system directives across all AI coding assistants in your repository.
Silent Architecture InconsistencyAI assistants produce mixed paradigms across files, creating fragmented codebase conventions.Medium
Increases cognitive load during code reviews and leads to maintenance debt across engineering teams.
Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails.
Architectural Directives in Detail

Step-by-Step Production Directives

Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:

1

Engineers MUST ALWAYS encapsulate raw cryptographic keys, biometric payloads, and plaintexts in a scoped AutoCloseable/Closeable resource (e.g., SecureBytes) and consume them strictly through scoped blocks (`use { ... }`).

Engineers MUST ALWAYS encapsulate raw cryptographic keys, biometric payloads, and plaintexts in a scoped AutoCloseable/Closeable resource (e.g., SecureBytes) and consume them strictly through scoped blocks (`use { ... }`).

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
2

Engineers MUST NOT represent cryptographic secrets as `String`, `CharSequence`, or immutable boxed collections, as JVM String interning and Kotlin/Native immutability prevent memory overwriting.

Engineers MUST NOT represent cryptographic secrets as `String`, `CharSequence`, or immutable boxed collections, as JVM String interning and Kotlin/Native immutability prevent memory overwriting.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
3

Code SHOULD allocate memory for secret materials using pinned native memory (iOS Kotlin Native `Arena` / `posix.memset_s`) or off-heap DirectByteBuffers on Android to evade GC compaction copies.

Code SHOULD allocate memory for secret materials using pinned native memory (iOS Kotlin Native `Arena` / `posix.memset_s`) or off-heap DirectByteBuffers on Android to evade GC compaction copies.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
4

Services MUST execute dead-store resistant zeroization (such as `memset_s`, `SecureZeroMemory`, or explicit volatile iteration) before releasing memory buffers back to the OS or allocator.

Services MUST execute dead-store resistant zeroization (such as `memset_s`, `SecureZeroMemory`, or explicit volatile iteration) before releasing memory buffers back to the OS or allocator.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
5

Components NEVER expose unzeroed ByteArrays across module or FFI boundaries without explicit ownership transfer and caller-cleanup contracts.

Components NEVER expose unzeroed ByteArrays across module or FFI boundaries without explicit ownership transfer and caller-cleanup contracts.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
Technical Questions & Answers

Frequently Asked Technical Questions

Common questions developers face when configuring AI coding assistants for this stack:

Q:Why is Kotlin Multiplatform Deterministic Cryptographic Memory Zeroization Guardrail critical for AI coding assistants?

Enforces deterministic cryptographic key and biometric token zeroization across Android ART and iOS native runtimes. Mandates pinned, off-heap, or mutable byte buffer allocations purged via volatile compiler-barrier memory wiping immediately after use to eliminate retention in swap space, core dumps, or compacting garbage collection passes. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.

Q:How does adopting this rule prevent AI hallucinations?

This rule explicitly declares what the AI must avoid (Leaking Ephemeral Cryptographic Secrets to Unmanaged GC Heaps via Immutable Strings or Unscrubbed ByteArrays) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.

Q:Which AI coding environments are supported?

This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).

Q:Can I combine this rule with other technology stacks?

Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.

Open Specification · CC BY 4.0·Free for Personal, Team & Commercial In-Repo Use

Citation & Open Source Attribution Guidelines

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You are completely free to adapt and share this rule in your workspace. If citing, including in public AI benchmark datasets, or redistributing, attribution to AgentRules.org is required.

Related MOBILE Rules

View all rules →
1 Rule in Stack

Kotlin