# 08 — AUDITORÍA DE SEGURIDAD, SANDBOX Y AISLAMIENTO EXPERIMENTAL (ORC-27)

## 1. Modelo de Ejecución en Dos Niveles (`ExecutionPolicy`)

| Nivel | Categoría | Descripción | Política Aplicada | Estado |
| :--- | :--- | :--- | :--- | :--- |
| **Categoría A** | Operaciones Internas Confiables | Algoritmos y pipelines internos verificados (`ALGORITHM_BENCHMARK_OPTIMIZATION`, `ALGORITHM_BENCHMARK_PREDICTIVE`, `FINANCIAL_QUANT_RESEARCH`, `AI_TRAINING_AND_EVALUATION`, `ROBOTICS_SIMULATION`, `CROSS_LAB_COLLABORATION_EVALUATION`). | Ejecución autorizada dentro del entorno controlado con validación de rutas y guardas de dominio. | **HABILITADO Y VERIFICADO** |
| **Categoría B** | Código Experimental / No Confiable | Código arbitrario o variantes dinámicas enviadas por usuario o propuestas automáticamente (`proposed_custom_code`, `custom_code`, `untrusted_code`). | **BLOQUEO ESTRICTO (`SANDBOX_UNAVAILABLE`)**. Solo se analiza sintácticamente vía AST sin ejecutarlo (`compile`/`exec`/`eval` prohibidos) y se conserva inactivo como `PENDING_SAFE_ENVIRONMENT`. | **BLOQUEADO POR SEGURIDAD** |

---

## 2. Auditoría y Endurecimiento de `ProcessSandbox` (`app/core/sandbox.py`)

### 2.1. Distinción Técnica Fundamental
- **`ProcessSandbox` NO es un sandbox de sistema operativo (OS Container / Windows AppContainer / Hyper-V).**
- Es un **arnés de subprocesos internos (`SUBPROCESS_HARNESS_NOT_OS_CONTAINER`)** diseñado exclusivamente para ejecutar scripts internos previamente validados dentro de `storage/sandbox_tmp`.
- Por esta razón, la Categoría B de código no confiable **permanece bloqueada** hasta contar con aislamiento real de nivel de sistema operativo.

### 2.2. Controles Verificados en `ProcessSandbox` (ORC-27)
1. **Confinamiento Canónico de Rutas (`CanonicalPathGuard`):**
   - Resolución real con `Path.resolve()` y verificación estricta con `os.path.commonpath`.
   - Bloqueo por componentes de ruta prohibidos (`digital optimus`, `digitaloptimus`, `digoptimus`, `mininova`, `mini optimus`, `optimus developer`, `cerebro`).
2. **Inspección Estática AST y de Tokens (`SandboxSecurityGuard.assert_code_safe`):**
   - Rechazo inmediato de `os.system`, `shutil.rmtree`, `subprocess.popen`, `format c:`, `ccxt`, `binance`, `coinbase`, `alpaca_trade_api`, `create_order`, `open_socket`, `eval`, `exec`, `__import__`, `compile`.
3. **Sanitización de Variables de Entorno (`ProcessSandbox.build_sanitized_env`):**
   - Eliminación de toda variable de entorno del host cuyo nombre contenga `API_KEY`, `SECRET`, `TOKEN`, `PASSWORD`, `CREDENTIAL`, `BROKER` o `PRIVATE_KEY`.
   - Inyección forzada de banderas de bloqueo en el subproceso:
     - `OPTIMUS_SANDBOX_SUBPROCESS=1`
     - `ALLOW_EXTERNAL_API_CALLS=False`
     - `ALLOW_LIVE_TRADING=False`
     - `ALLOW_PHYSICAL_ACTUATION=False`
4. **Directorio de Trabajo Aislado (`cwd`):**
   - Todo subproceso se ejecuta con `cwd=str(settings.sandbox_tmp_path.resolve())`.
5. **Límite de Tiempo (`timeout_seconds`) y Límite de Memoria (`max_memory_mb`) en Árbol de Procesos:**
   - Monitoreo en bucle cada 20 ms sobre el proceso hijo y todos sus subprocesos descendientes (`ps_proc.children(recursive=True)`), indispensable en Windows donde `.venv\Scripts\python.exe` actúa como lanzador del intérprete real.
   - Si el RSS acumulado supera `self.max_memory_mb`, se mata inmediatamente todo el árbol de procesos y se retorna `success=False`, `exit_code=-2`.

---

## 3. Guardas de Seguridad de Dominio (Robótica y Finanzas)

### 3.1. Robótica (`RoboticsSimulationEngine.assert_simulation_only`)
- **Ubicación:** `app/lab_ai/robotics_sim.py`
- **Comprobación activa:** Verifica `PHYSICAL_HARDWARE_CONNECTED == False`, `HARDWARE_CONTROL_SAFETY_LOCK == True`, ausencia de `allow_physical_actuation=True`, ausencia de `hardware_interface` y variable de entorno `ALLOW_PHYSICAL_ACTUATION != "true"`.
- **Excepción disparada en pruebas negativas:** `HardwareActuationLockedError`.

### 3.2. Finanzas Cuantitativas (`QuantitativeResearchEngine.assert_no_live_trading`)
- **Ubicación:** `app/lab_algorithms/financial.py`
- **Comprobación activa:** Verifica `LIVE_TRADING_ENABLED == False`, `BROKER_SAFETY_LOCK == True`, ausencia de `live_order=True`, ausencia de `broker_endpoint` y variable de entorno `ALLOW_LIVE_TRADING != "true"`.
- **Excepción disparada en pruebas negativas:** `RealTradingProhibitedError`.

