You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.0 KiB
4.0 KiB
SharedArrayBuffer, Spectre, and Cross-Origin Isolation Concerns
1. Introduction to SharedArrayBuffer
Overview
SharedArrayBuffer
is a JavaScript object that enables shared memory access between the main thread and Web Workers.- Unlike
ArrayBuffer
, the memory is not copied between threads—allowing true parallelism. - Paired with
Atomics
, it allows low-level memory synchronization (e.g., locks, waits).
Example Use
const sab = new SharedArrayBuffer(1024);
const sharedArray = new Uint8Array(sab);
sharedArray[0] = 42;
2. Browser Security Requirements
Security Headers Required to Use SharedArrayBuffer
Modern browsers restrict access to SharedArrayBuffer
due to Spectre-class vulnerabilities.
The following HTTP headers must be set to enable it:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
HTTPS Requirement
- Must be served over HTTPS (except
localhost
for dev). - These headers enforce cross-origin isolation.
Role of CORS
- CORS alone is not sufficient.
- However, embedded resources (like scripts and iframes) must still include proper CORS headers if they are to be loaded in a cross-origin isolated context.
3. Spectre Vulnerability
What is Spectre?
- A class of side-channel attacks exploiting speculative execution in CPUs.
- Allows an attacker to read arbitrary memory from the same address space.
Affected Architectures
- Intel, AMD, ARM — essentially all modern processors.
Why It's Still a Concern
- It's a hardware flaw, not just a software bug.
- Can't be fully fixed in software without performance penalties.
- New Spectre variants (e.g., v2, RSB, BranchScope) continue to emerge.
4. Mitigations and Current Limitations
Browser Mitigations
- Restricted precision for
performance.now()
. - Disabled or gated access to
SharedArrayBuffer
. - Reduced or removed fine-grained timers.
OS/Hardware Mitigations
- Kernel Page Table Isolation (KPTI)
- Microcode updates
- Retpoline compiler mitigations
Developer Responsibilities
- Avoid sharing sensitive data across threads unless necessary.
- Use constant-time cryptographic functions.
- Assume timing attacks are still possible.
- Opt into cross-origin isolation only when absolutely required.
5. Practical Development Notes
Using SharedArrayBuffer Safely
- Ensure the site is cross-origin isolated:
- Serve all resources with appropriate CORS policies (
Cross-Origin-Resource-Policy
,Access-Control-Allow-Origin
) - Set the required COOP/COEP headers
- Serve all resources with appropriate CORS policies (
- Validate support using:
if (window.crossOriginIsolated) {
// Safe to use SharedArrayBuffer
}
Testing and Fallback
- Provide fallbacks to
ArrayBuffer
if isolation is not available. - Document use cases clearly (e.g., high-performance WebAssembly applications or real-time audio/video processing).
6. Summary of Concerns and Advisements
Topic | Concern / Consideration | Advisory |
---|---|---|
Shared Memory | Can expose sensitive data across threads | Use only in cross-origin isolated environments |
Spectre Vulnerabilities | Still viable, evolving with new attack vectors | Do not assume complete mitigation; minimize attack surfaces |
Cross-Origin Isolation | Required for SharedArrayBuffer |
Must serve with COOP/COEP headers + HTTPS |
CORS | Not sufficient alone | Must combine with full isolation policies |
Developer Security Practices | Timing attacks and shared state remain risky | Favor safer primitives; avoid unnecessary complexity |