# Security Fix TODO Plan
## Overview
This document outlines the implementation plan for the remaining 3 items from `SECURITY_FIX_PLAN_2026-05-25.md` that require additional infrastructure or testing.
## Status Summary
- **Completed**: 23/25 items (92%)
- **Pending**: 3 items (8%)
- **Blocker**: Multi-user authentication infrastructure
---
## Pending Items
### K12/K13/K23: /proc Access Control
**Current Status**: Partially implemented, disabled due to regressions
**Location**: `src/kernel/procfs.c:42-53`
**Problem**:
- UID check implemented but disabled because AdrOS lacks complete UID/EUID infrastructure
- Processes are created with uid=0 by default
- No real authentication mechanism exists
- Check blocked access during tests even when it shouldn't
**Implementation Requirements**:
#### Phase 1: UID Infrastructure
1. **Process UID Inheritance**
- Ensure fork/clone properly inherit uid/euid/suid/sgid
- Verify execve doesn't reset uid to 0
- Add tests for UID inheritance across process lifecycle
2. **Login/Authentication**
- Implement basic login mechanism (e.g., /bin/login)
- Add password file support (/etc/passwd, /etc/shadow)
- Implement setuid/setgid/seteuid/setegid properly
- Add PAM-like framework for future extensibility
3. **System Process UID Assignment**
- init process: uid=0 (root)
- System services: uid=0 or dedicated service UIDs
- User processes: uid from login
#### Phase 2: /proc UID Check Implementation
1. **Re-enable UID Check in proc_find_pid_safe**
```c
if (current_process && current_process->uid != p->uid && current_process->uid != 0) {
p = NULL; /* Access denied */
}
```
2. **Add Process Pin/Refcount**
- Implement process_ref/process_unref functions
- Call process_ref before returning from proc_find_pid_safe
- Call process_unref after read operation completes
- Prevents UAF if process exits during read
3. **Address Redaction in /proc/<pid>/maps**
- Redact physical addresses from memory maps
- Only show virtual addresses to non-root users
- Prevent information leak about kernel memory layout
**Testing**:
- Test that root can read all /proc/<pid>/*
- Test that non-root can only read own /proc/<pid>/*
- Test that non-root cannot read other processes' /proc/<pid>/*
- Test that process exit during read doesn't cause UAF
- Test address redaction in maps for non-root users
**Estimated Effort**: 2-3 days
---
### K15: Raw Socket Privilege Check
**Current Status**: Partially implemented, disabled due to regressions
**Location**: `src/kernel/socket.c:252-261`
**Problem**:
- Same UID infrastructure issue as K12/K13/K23
- Check blocked all socket creation when not properly configured
**Implementation Requirements**:
#### Phase 1: UID Infrastructure (Shared with K12/K13/K23)
- Same Phase 1 requirements as K12/K13/K23
#### Phase 2: Re-enable Privilege Check
1. **Re-enable Check in ksocket_create**
```c
if (type == SOCK_RAW) {
if (!current_process || current_process->uid != 0) {
return -EPERM;
}
}
```
2. **Add CAP_NET_RAW Capability (Optional)**
- Implement Linux-style capability framework
- Allow non-root with CAP_NET_RAW to create raw sockets
- More flexible than simple uid==0 check
**Testing**:
- Test that root can create SOCK_RAW sockets
- Test that non-root cannot create SOCK_RAW sockets
- Test that non-root with CAP_NET_RAW can create SOCK_RAW (if implemented)
- Test ICMP ping works as root
- Test ICMP ping fails as non-root
**Estimated Effort**: 1-2 days (depends on UID infrastructure)
---
### K24: NX Flag in Shared Memory
**Current Status**: Disabled for safety
**Location**: `src/kernel/shm.c:191`
**Problem**:
- NX bit is now properly enabled in boot.S and works for ELF loader, mmap, brk
- SHM mapping with NX needs additional testing
- Risk of breaking JIT compilers or other legitimate use cases
**Implementation Requirements**:
#### Phase 1: Test Suite
1. **Create SHM NX Test Cases**
- Test basic SHM read/write with NX
- Test SHM used for code storage (if applicable)
- Test SHM used for JIT compilation
- Test SHM used for inter-process communication
2. **Add mprotect Support for SHM**
- Implement shmctl with IPC_RMID to change permissions
- Allow users to explicitly enable/disable NX on SHM segments
- Add PROT_EXEC support for SHM via mprotect
#### Phase 2: Enable NX with Fallback
1. **Enable NX by Default**
```c
vmm_map_page((uint64_t)seg->pages[i],
(uint64_t)(vaddr + i * PAGE_SIZE),
VMM_FLAG_PRESENT | VMM_FLAG_RW | VMM_FLAG_USER | VMM_FLAG_NX);
```
2. **Add SHM Creation Flag for Executable SHM**
- Add flag to shmget to request executable SHM
- Only allow root to create executable SHM
- Document security implications
3. **Add Runtime Detection**
- Detect if NX causes issues (e.g., via signal handler)
- Log warnings if process tries to execute from SHM
- Provide diagnostic information
**Testing**:
- Run full test suite with NX enabled in SHM
- Test that SHM read/write works correctly
- Test that execution from SHM is blocked
- Test that mprotect can enable execution if needed
- Test that JIT use cases still work (if any exist)
**Estimated Effort**: 1-2 days
---
## Implementation Order
### Option 1: Complete UID Infrastructure First (Recommended)
1. Implement Phase 1 of K12/K13/K23 (UID infrastructure)
2. Complete K12/K13/K23 (Phase 2)
3. Complete K15 (Phase 2)
4. Complete K24
**Advantages**:
- Solves infrastructure dependency once
- Enables both K12/K13/K23 and K15
- More comprehensive security model
**Disadvantages**:
- Larger upfront effort
- Longer time to see results
### Option 2: Quick Wins First
1. Complete K24 (independent of UID infrastructure)
2. Implement minimal UID infrastructure
3. Complete K12/K13/K23
4. Complete K15
**Advantages**:
- K24 can be done independently
- Faster initial progress
**Disadvantages**:
- UID infrastructure still needed for K12/K13/K23 and K15
- May need to revisit UID infrastructure design
---
## Dependencies
```
K12/K13/K23 ──┐
├──> UID Infrastructure (Phase 1)
K15 ──────────┘
K24 (independent)
```
---
## Testing Strategy
### Unit Tests
- UID inheritance tests
- /proc access control tests
- Socket privilege tests
- SHM NX tests
### Integration Tests
- Multi-user login/logout flow
- Root vs non-root process behavior
- Cross-process SHM with NX
### Regression Tests
- Ensure existing tests still pass
- No performance degradation
- No new kernel panics
---
## Risk Assessment
### High Risk
- UID infrastructure changes affect entire system
- May break existing functionality
- Requires extensive testing
### Medium Risk
- /proc access control may break monitoring tools
- Socket privilege check may break network tools
### Low Risk
- SHM NX flag is isolated to SHM subsystem
- Can be easily disabled if issues arise
---
## Success Criteria
- All 3 items implemented and enabled
- Test suite passes with no regressions
- Documentation updated
- Security audit passes
---
## Timeline Estimate
- **UID Infrastructure**: 3-4 days
- **K12/K13/K23**: 2-3 days
- **K15**: 1-2 days
- **K24**: 1-2 days
- **Testing & Validation**: 2-3 days
**Total**: 9-14 days (depending on option chosen)