DirectPipe에서 보안 취약점을 발견하셨다면, 공개 이슈로 보고하지 마세요. 악용 가능성이 있으므로 비공개 채널을 사용해 주세요.
If you discover a security vulnerability in DirectPipe, please do NOT report it as a public issue. Use private channels to prevent potential exploitation.
- GitHub Security Advisory: Report a vulnerability
다음 영역의 취약점을 보고해 주세요 / Please report vulnerabilities in these areas:
- WebSocket/HTTP 서버 (인증 우회, 명령 주입 등) / WebSocket/HTTP server (auth bypass, command injection)
- IPC 공유 메모리 접근 제어 / IPC shared memory access control
- 자동 업데이터 보안 (다운로드 무결성) / Auto-updater security (download integrity)
- VST 플러그인 로딩 경로 주입 / VST plugin loading path injection
아래는 공개 버전 지원 정책입니다. 4.4.0은 현재 미공개 로컬 후보이며 이 표의 공개 릴리즈 상태를 변경하지 않습니다. / The table is the published support policy; the local 4.4.0 candidate is not a published release.
| Version | Supported |
|---|---|
| v4.3.0 | ✅ |
| v4.2.7 | |
| v4.2.3 | |
| v4.2.6 (withdrawn) | ❌ |
| v4.1.x | |
| v3.10.x (legacy) | |
| < v3.10 | ❌ |
DirectPipe의 모든 네트워크 서비스는 localhost (127.0.0.1)에만 바인딩됩니다. 외부 네트워크에서 접근할 수 없습니다.
All network services bind to localhost (127.0.0.1) only. No remote access is possible.
| 서비스 / Service | 포트 / Port | 프로토콜 / Protocol | 용도 / Purpose |
|---|---|---|---|
| WebSocket | 기본 8765 (설정값 실패 시 +1..+5 포트 자동 시도) / default 8765 (auto-tries +1..+5 on bind failure) | TCP | 실시간 상태 브로드캐스트 + 명령 수신 / Real-time state broadcast + command input |
| HTTP REST API | 기본 8766 (설정값 실패 시 +1..+5 포트 자동 시도) / default 8766 (auto-tries +1..+5 on bind failure) | TCP | GET-only REST API (상태 조회, 명령 실행) / Status query, command execution |
| UDP Discovery | 8767 | UDP | Stream Deck 플러그인 자동 감지 / Stream Deck plugin auto-discovery |
인증 없음 (No Authentication): localhost 전용이므로 인증을 요구하지 않습니다. 같은 PC의 모든 프로세스가 접근 가능합니다.
No authentication: Since services are localhost-only, no auth is required. Any process on the same machine can access them.
알려진 제한사항 (WebSocket): 핸드셰이크에서 Origin 검증이나 토큰 인증을 수행하지 않습니다. localhost에서 접속 가능한 로컬 프로세스는 모두 명령 전송이 가능합니다.
Known limitation (WebSocket): The handshake does not enforce Origin validation or token auth. Any local process that can connect to localhost can send commands.
연결 제한 / Connection Limits:
- WebSocket: 최대 32개 동시 연결 (초과 시 거부) / Max 32 concurrent connections (excess rejected)
- HTTP: 최대 64개 동시 핸들러 (초과 시 거부) / Max 64 concurrent handlers (excess rejected). HTTP는 Connection: close 방식이므로 각 요청이 수 ms 내에 완료됨 / HTTP uses Connection: close, each request completes in milliseconds
입력 검증 / Input Validation: HTTP와 WebSocket 명령은 정수·유한 실수·불리언·문자열 타입과 액션별 범위를 변환 전에 검사합니다. 잘못된 WebSocket 메시지는 무시하고 HTTP 요청은 오류 응답을 반환합니다. / HTTP and WebSocket commands validate integer, finite-number, boolean, string, and action-specific ranges before conversion. Invalid WebSocket messages are ignored; invalid HTTP requests return an error response.
HTTP API는 Access-Control-Allow-Origin: *를 사용합니다. 이는 브라우저 기반 클라이언트(OBS 브라우저 소스, 커스텀 웹 대시보드 등)를 지원하기 위한 설계입니다.
The HTTP API uses Access-Control-Allow-Origin: * to support browser-based clients (OBS browser sources, custom web dashboards).
알려진 제한사항: 이 설정으로 인해 악의적인 웹사이트가 사용자의 브라우저를 통해 DirectPipe API에 접근할 수 있습니다 (CSRF). localhost 전용이므로 원격 공격은 불가하지만, 로컬 브라우저를 통한 간접 접근은 가능합니다.
Known limitation: This allows malicious websites to access the DirectPipe API through the user's browser (CSRF). Remote attacks are impossible (localhost-only), but indirect access via local browser is possible.
참고: CORS preflight 응답의
Access-Control-Allow-Methods에POST, PUT, DELETE가 포함되어 있지만, 실제로는 GET과 OPTIONS만 처리됩니다. 향후 최소 권한 원칙에 따라GET, OPTIONS로 제한하는 것을 검토 중입니다. Note: The CORS preflight response includesPOST, PUT, DELETEinAccess-Control-Allow-Methods, but only GET and OPTIONS are actually handled. Restricting toGET, OPTIONSper least-privilege principle is under consideration.
모든 HTTP 엔드포인트가 GET으로 동작하는 이유:
Why all HTTP endpoints use GET:
- curl/브라우저 호환:
curl http://localhost:8766/api/mute/panic한 줄로 즉시 테스트 가능 / One-liner testing with curl or browser address bar - OBS 브라우저 소스:
fetch()API로 즉시 호출 가능, CORS preflight 불필요 (simple request) / Instant invocation from OBS browser sources - AutoHotkey/스크립트: POST body 구성 없이 URL만으로 제어 가능 / Control via URL only, no POST body construction
REST 의미론상 상태 변경은 POST가 맞지만, localhost 전용 + 단일 사용자 환경에서는 실용성을 우선했습니다. 향후 제품 성숙도가 올라가면 조회=GET, 변경=POST, 로컬 토큰 인증 분리를 검토합니다.
Strictly speaking, state-changing actions should use POST per REST semantics, but for a localhost-only single-user tool, practicality was prioritized. As the product matures, separating GET (query) / POST (mutation) with local token auth is under consideration.
호스트 ↔ Receiver VST 간 오디오 전송은 OS 공유 메모리를 사용합니다.
Audio transfer between host and Receiver VST uses OS shared memory.
4.4.0은 기존 Local\DirectPipeAudio와 별도로
Local\DirectPipeAudioFanOutV1에 최대 8개의 독립 큐를 둡니다. 양쪽 모두 아래
공유 메모리 권한을 사용하며, 큐 분리는 같은 사용자 프로세스에 대한 보안 격리가 아닙니다.
Named Event/semaphore 알림은 legacy 전송에만 남고 새 전송은 producer 확인과
슬롯별 atomic 상태를 사용합니다. 슬롯 회수는 정상 해제 또는 확인된 프로세스 종료에
한하며, callback 정지·시간 초과만으로 소유권을 빼앗지 않습니다.
/ The additive eight-reader mapping uses the same access policy as the legacy
mapping. Independent queues are not a same-user security boundary. Only legacy
delivery uses the named event/semaphore; fan-out uses producer acknowledgement
and per-slot atomic state. Reclaim requires release or proven process death.
| 플랫폼 / Platform | 메커니즘 / Mechanism | 권한 / Permissions |
|---|---|---|
| Windows | CreateFileMapping + CreateEvent |
기본 DACL (같은 사용자 접근 가능) / Default DACL (same-user access) |
| macOS/Linux | shm_open + sem_open |
0600 (소유자 전용) / Owner-only |
알려진 제한사항 (Windows): Windows의 기본 DACL은 같은 사용자 계정의 다른 프로세스가 공유 메모리에 접근할 수 있습니다. 악의적 프로세스가 오디오 데이터를 읽거나 주입할 수 있습니다.
Known limitation (Windows): Default DACL allows other processes running as the same user to access shared memory. A malicious process could read or inject audio data.
자동 업데이터는 GitHub Releases API에서 최신 버전을 확인하고, 바이너리를 다운로드합니다.
The auto-updater checks the GitHub Releases API for new versions and downloads binaries.
무결성 검증 / Integrity Verification:
-
v4.2.0 이상 Windows 인앱 업데이트는 정확히 일치하는
checksums.sha256항목과 다운로드 파일의 SHA-256 일치를 필수로 검증합니다 -
checksum metadata가 없거나 읽을 수 없거나 일치하지 않으면 교체 전에 fail-closed합니다
-
최소 파일 크기 검증 (100 KiB 이상)
-
현재 신뢰된 코드 서명 인증서가 없으므로 공식 Windows 패키지도 unsigned일 수 있습니다. 인앱 checksum은 전송/패키지 정합성 검사이며 Authenticode publisher identity를 대신하지 않습니다
-
Windows in-app updates for v4.2.0 and later require an exact readable
checksums.sha256entry and matching downloaded SHA-256 -
Missing, unreadable, or mismatched checksum metadata fails closed before replacement
-
Minimum file size check (at least 100 KiB)
-
With no trusted code-signing certificate configured, official Windows packages may be unsigned. The in-app checksum verifies package/transport consistency; it does not replace Authenticode publisher identity
플랫폼별 동작 / Platform Behavior:
- Windows: 자동 다운로드 → 배치 스크립트로 교체 → 재시작 / Auto-download → batch script replacement → restart
- macOS/Linux: "View on GitHub" 버튼 (수동 다운로드) / Manual download only
Windows에서 Receiver를 포함한 갱신은 대상 경로·실제 제품/포맷·버전과 패키지 SHA-256을 검증한 뒤 PowerShell 트랜잭션으로 적용합니다. 준비한 파일도 재검증하고 사용 중인 대상은 차단하며, 전체 VST3 번들을 교체하고 실패 시 백업 복구를 시도합니다. 현재/더 최신 버전은 보존합니다. 보호된 경로는 UAC를 요구할 수 있습니다. OBS/DAW는 자동 종료하지 않고 Retry / Later로 안내하며 Receiver-only 갱신은 본체를 종료하지 않습니다. Receiver가 없는 host-only 갱신은 기존 배치 경로를 유지합니다. / Companion upkeep validates exact targets, product/format/version, archive hash and staged identities, then uses a PowerShell transaction with in-use checks, complete VST3 bundle replacement and attempted rollback on failure. Current/newer versions are preserved. UAC may be required. Apps are closed manually; Receiver-only maintenance leaves the host running. Host-only updates retain the batch path.
-
Out-of-process 스캔: VST 플러그인 스캔은 별도 자식 프로세스에서 실행됩니다. 플러그인이 스캔 중 크래시해도 호스트에 영향 없음
-
블랙리스트: 스캔 중 크래시한 플러그인은 자동으로 블랙리스트에 등록
-
런타임 크래시 보호:
processBlock호출은 Windows에서__try/__except(SEH), 기타 플랫폼에서try/catch(...)로 보호. 크래시 시 체인 자동 바이패스 + 사용자 알림 -
Out-of-process scanning: Plugin scanning runs in a separate child process. Host is not affected by scanner crashes
-
Blacklisting: Plugins that crash during scanning are automatically blacklisted
-
Runtime crash protection:
processBlockis wrapped in__try/__except(SEH) on Windows,try/catch(...)on other platforms. On crash: chain auto-bypassed + user notified
-
크로스 OS 보호:
platform필드가 포함된 백업은 다른 OS에서 복원 시 차단됩니다. 단, 레거시 백업(플랫폼 필드 없음)은 호환성 때문에 허용될 수 있습니다 -
파일 무결성: 모든 설정/프리셋 저장은
atomicWriteFile()패턴 (.tmp → .bak → rename)을 사용하여 전원 중단 시에도 파일이 손상되지 않습니다 -
Cross-OS protection: Backups with a
platformfield are blocked on different OS. Legacy backups without a platform field may still be accepted for backward compatibility -
File integrity: All settings/preset saves use
atomicWriteFile()pattern (.tmp → .bak → rename) for crash-safe writes
-
Audit Mode를 켜면 HTTP 응답 일부, WebSocket payload, 장치/플러그인 상세 상태가 로그에 더 많이 기록됩니다.
-
공유 PC/공개 스트리밍 환경에서는 로그 파일 공유 전에 민감 정보를 검토/마스킹하세요.
-
With Audit Mode enabled, logs may include extra HTTP response excerpts, WebSocket payloads, and detailed device/plugin state.
-
In shared PCs or public support channels, review/mask sensitive parts before sharing logs.