go-webgpu is currently in initial release (v0.x.x). We provide security updates for the following versions:
| Version | Supported |
|---|---|
| 0.1.x | ✅ |
| < 0.1.0 | ❌ |
Future stable releases (v1.0+) will follow semantic versioning with LTS support.
We take security seriously. If you discover a security vulnerability in go-webgpu, please report it responsibly.
DO NOT open a public GitHub issue for security vulnerabilities.
Instead, please report security issues by:
-
Private Security Advisory (preferred): https://github.com/go-webgpu/webgpu/security/advisories/new
-
Email to maintainers: Create a private GitHub issue or contact via discussions
Please include the following information in your report:
- Description of the vulnerability
- Steps to reproduce the issue
- Affected versions (which versions are impacted)
- Potential impact (memory corruption, crashes, GPU resource leaks, etc.)
- Suggested fix (if you have one)
- Your contact information (for follow-up questions)
- Initial Response: Within 48-72 hours
- Triage & Assessment: Within 1 week
- Fix & Disclosure: Coordinated with reporter
We aim to:
- Acknowledge receipt within 72 hours
- Provide an initial assessment within 1 week
- Work with you on a coordinated disclosure timeline
- Credit you in the security advisory (unless you prefer to remain anonymous)
go-webgpu provides Go bindings to wgpu-native, which interfaces with GPU hardware. This introduces security considerations that users should be aware of.
Risk: go-webgpu uses FFI (Foreign Function Interface) to call native wgpu library functions.
Attack Vectors:
- Incorrect pointer handling in FFI calls
- Memory corruption from mismatched struct layouts
- Use-after-free from incorrect resource lifetime management
Mitigation:
- Careful struct layout matching with C headers
- Explicit resource cleanup with Release/Drop methods
- Extensive testing on all platforms
- golangci-lint with FFI-aware configuration
User Recommendations:
// Always release GPU resources when done
device := adapter.CreateDevice(nil)
defer device.Release()
buffer := device.CreateBuffer(&wgpu.BufferDescriptor{...})
defer buffer.Release()Risk: Improper resource management can exhaust GPU memory or cause driver crashes.
Attack Vectors:
- Creating buffers/textures without releasing them
- Infinite loops in compute shaders
- Excessive command buffer submissions
Mitigation:
- Explicit resource lifetime management
- wgpu-native's built-in validation layer
- Device lost callbacks for error recovery
User Best Practices:
// Enable validation in development
instance := wgpu.CreateInstance(nil)
// Use device lost callback
device := adapter.CreateDevice(&wgpu.DeviceDescriptor{
DeviceLostCallback: func(reason wgpu.DeviceLostReason, message string) {
log.Printf("Device lost: %v - %s", reason, message)
},
})
// Always release resources
defer texture.Release()
defer buffer.Release()
defer pipeline.Release()Risk: WGSL shaders execute on GPU and could potentially cause issues.
Attack Vectors:
- Malformed WGSL causing driver crashes
- Infinite loops in shaders (GPU hang)
- Out-of-bounds buffer access in shaders
Mitigation:
- wgpu-native validates all WGSL shaders
- WebGPU spec mandates bounds checking
- No access to system resources from shaders
- Shader compilation errors are returned to application
User Recommendations:
// Always check shader compilation errors
shaderModule, err := device.CreateShaderModule(&wgpu.ShaderModuleDescriptor{
WGSLDescriptor: &wgpu.ShaderModuleWGSLDescriptor{
Code: wgslSource,
},
})
if err != nil {
log.Printf("Shader compilation failed: %v", err)
return err
}Risk: Mapped buffers provide direct memory access.
Attack Vectors:
- Reading unmapped buffer memory
- Writing beyond buffer bounds
- Using mapped pointer after unmap
Mitigation:
- WebGPU spec enforces mapping state machine
- Bounds checking in GetMappedRange
- wgpu-native validation
User Best Practices:
// Wait for map to complete before accessing
buffer.MapAsync(wgpu.MapModeRead, 0, size, func(status wgpu.BufferMapAsyncStatus) {
if status != wgpu.BufferMapAsyncStatusSuccess {
return
}
// Only access after successful map
data := buffer.GetMappedRange(0, size)
// ... use data ...
buffer.Unmap()
// Don't use 'data' after Unmap!
})Risk: Surface creation requires platform-specific window handles.
Attack Vectors:
- Invalid window handle causing crashes
- Surface use after window destruction
- Cross-platform handle confusion
Mitigation:
- Platform-specific surface creation functions
- Validation of window handles where possible
- Clear documentation of lifetime requirements
User Recommendations:
// Ensure window is valid before creating surface
surface, err := instance.CreateSurface(&wgpu.SurfaceDescriptor{
WindowsHWND: &wgpu.SurfaceDescriptorFromWindowsHWND{
Hwnd: hwnd, // Must be valid HWND
},
})
if err != nil {
return err
}
// Release surface before destroying window
surface.Release()
// Then destroy windowRisk: go-webgpu loads wgpu-native as a dynamic library.
Attack Vectors:
- DLL hijacking (malicious library in search path)
- Library version mismatch
- Missing library dependencies
Mitigation:
- Explicit library paths recommended
- Version checking at load time
- Clear error messages for missing libraries
User Best Practices:
// Set explicit library path if needed
os.Setenv("WGPU_NATIVE_PATH", "/path/to/wgpu_native.dll")
// Or place library in application directoryAlways release GPU resources:
device := adapter.CreateDevice(nil)
defer device.Release()
// Create resources
buffer := device.CreateBuffer(...)
texture := device.CreateTexture(...)
pipeline := device.CreateRenderPipeline(...)
// Release in reverse order
defer pipeline.Release()
defer texture.Release()
defer buffer.Release()Always check errors:
// Check adapter request
adapter, err := instance.RequestAdapter(...)
if err != nil {
return fmt.Errorf("failed to get adapter: %w", err)
}
// Check device creation
device, err := adapter.CreateDevice(...)
if err != nil {
return fmt.Errorf("failed to create device: %w", err)
}
// Check shader compilation
module, err := device.CreateShaderModule(...)
if err != nil {
return fmt.Errorf("shader error: %w", err)
}Use error scopes for detailed GPU error information:
device.PushErrorScope(wgpu.ErrorFilterValidation)
// ... GPU operations ...
device.PopErrorScope(func(err wgpu.Error) {
if err != nil {
log.Printf("GPU validation error: %v", err)
}
})Status: Dependency on upstream security.
Risk Level: Low
Description: go-webgpu's security depends on wgpu-native. We track wgpu-native releases and update accordingly.
Status: Careful implementation with testing.
Risk Level: Medium
Description: FFI calls require careful pointer and memory management. We maintain extensive tests and linter checks.
Status: Platform-specific code paths tested.
Risk Level: Low
Description: Different platforms (Windows, Linux, macOS) have different loader and surface implementations.
go-webgpu dependencies:
| Dependency | Purpose | Security Notes |
|---|---|---|
| github.com/go-webgpu/goffi | Pure-Go FFI | Minimal, no CGO |
| wgpu-native (external) | WebGPU implementation | Mozilla/gfx-rs maintained |
Monitoring:
- Dependabot enabled for Go dependencies
- Track wgpu-native releases for security updates
- Unit tests for all public APIs
- Platform-specific tests (Windows, Linux, macOS)
- Memory leak detection in examples
- golangci-lint with security linters
- Fuzz testing for FFI boundaries
- Integration tests with various GPU drivers
- Security-focused code review
Initial release - No security issues reported yet.
- GitHub Security Advisory: https://github.com/go-webgpu/webgpu/security/advisories/new
- Public Issues (for non-sensitive bugs): https://github.com/go-webgpu/webgpu/issues
- Discussions: https://github.com/go-webgpu/webgpu/discussions
go-webgpu does not currently have a bug bounty program. We rely on responsible disclosure from the security community.
If you report a valid security vulnerability:
- Public credit in security advisory (if desired)
- Acknowledgment in CHANGELOG
- Our gratitude and recognition in README
Thank you for helping keep go-webgpu secure!
Security is a journey, not a destination. We continuously improve our security posture with each release.