
Подробный анализ критической уязвимости OpenSSH CVE 2023 38408, включая технические предпосылки, эксплуатацию в контролируемых средах и стратегии смягчения последствий.
Цель этого отчета — проанализировать CVE-2023-38408, критическую реальную уязвимость, обнаруженную в OpenSSH, как с теоретической точки зрения, так и с помощью практического моделирования. В отчете объясняются технические основы уязвимости, демонстрируется, как ее можно эксплуатировать в контролируемых средах, и рассматриваются реализованные меры по смягчению последствий.
Понимание реальных уязвимостей безопасности с помощью практического моделирования не только помогает защитить системы, но и повышает осведомленность разработчиков и системных администраторов о потенциальных векторах атак. Анализ таких уязвимостей устраняет разрыв между теорией и практической реализацией безопасности.
CVE-2023-38408 — это уязвимость, затрагивающая ssh-agent в OpenSSH, когда включена поддержка PKCS#11. Она позволяет выполнять удаленный код на клиентской машине, если пользователь подключается к скомпрометированному серверу с включенной пересылкой агента (ssh -A). Эта уязвимость имеет серьезные последствия для любой системы, использующей OpenSSH для безопасной аутентификации.
| Детали CVE | Информация |
|---|---|
| CVE ID | CVE-2023-38408 |
| CVSS Score | 9.8 (Critical) |
| Затронутые версии | OpenSSH < 9.3p2 |
| Вектор атаки | Сеть |
| Требуемые привилегии | Нет |
| Взаимодействие пользователя | Требуется |
| Воздействие | Полная компрометация системы |
SSH (Secure Shell) — это криптографический сетевой протокол, используемый для безопасной связи по незащищенным сетям. Он обеспечивает зашифрованные каналы для удаленного входа, выполнения команд, передачи файлов и многого другого.```mermaid graph LR A[SSH Client] -->|Encrypted Connection| B[SSH Server] A -->|Authentication| C[ssh-agent] C -->|Private Keys| D[Key Store] B -->|Agent Forwarding| E[Remote ssh-agent Proxy]
### 2.2 Что такое ssh-agent
`ssh-agent` — это фоновый процесс, который хранит ваши расшифрованные закрытые SSH-ключи в памяти, позволяя использовать их без повторного ввода парольной фразы каждый раз при подключении к удалённой системе.
#### Пересылка агента (ssh -A)
Пересылка агента позволяет удалённой системе получить доступ к вашему локальному `ssh-agent` через сокет домена Unix. Это полезно для цепочек SSH-соединений, но вносит значительные риски безопасности, если удалённая машина скомпрометирована.```mermaid
sequenceDiagram
participant Client as SSH Client
participant Agent as ssh-agent
participant Server as Remote Server
participant Proxy as Agent Proxy
Client->>Agent: Start agent
Client->>Server: ssh -A user@server
Server->>Proxy: Create proxy socket
Note over Server,Proxy: SSH_AUTH_SOCK=/tmp/ssh-xxx/agent.xxx
Server->>Proxy: ssh-add request
Proxy->>Client: Forward request
Client->>Agent: Process request
Agent->>Client: Response
Client->>Proxy: Forward response
Proxy->>Server: Final response
Технически, когда вы используете ssh -A, SSH-клиент создает сокет домена Unix на удаленном сервере, который выступает в качестве прокси для вашего локального ssh-agent. Переменная среды SSH_AUTH_SOCK устанавливается так, чтобы указывать на этот прокси-сокет. Любые вызовы, сделанные к SSH_AUTH_SOCK на удаленном сервере, перенаправляются обратно через SSH-соединение и обрабатываются вашим локальным ssh-agent.
PKCS#11 — это стандартный API для взаимодействия с криптографическими токенами, такими как смарт-карты, YubiKeys или виртуальные модули безопасности оборудования (HSM).
| PKCS#11 Function | Purpose | Risk Level |
|---|---|---|
C_Initialize() | Инициализировать библиотеку | Низкий |
C_GetSlotList() | Список доступных слотов | Низкий |
C_FindObjects() | Найти криптографические объекты | Средний |
C_Sign() | Подписать данные | Высокий |
dlopen() | Загрузить общую библиотеку | Критический |
OpenSSH ssh-agent поддерживает загрузку PKCS#11-провайдеров (общих библиотек .so) с помощью команды ssh-add -s /path/to/provider.so. Эти библиотеки позволяют агенту взаимодействовать с безопасными аппаратными или программными модулями для использования закрытых ключей без их прямого раскрытия.
Под капотом, при вызове ssh-add -s выполняются следующие действия:
.so динамически загружается в память с помощью dlopen().C_Initialize(), C_GetSlotList(), C_FindObjects() и C_Sign() через API PKCS#11.| Атрибут | Детали |
|---|---|
| ID | CVE-2023-38408 |
| Серьезность | Высокий (CVSS 9.8) |
| Временная шкала | Раскрыта в июле 2023, исправлено в OpenSSH 9.3p2 |
| Затронутое ПО | OpenSSH версий до 9.3p2 с поддержкой PKCS#11 |
| Сложность атаки | Низкая |
| Вектор атаки | Сеть через перенаправление SSH-агента |
Уязвимость возникает из-за того, что ssh-agent загружает любой файл общей библиотеки (.so), предоставленный через ssh-add -s, без проверки, является ли он легитимным PKCS#11-провайдером.```mermaid
graph TD
A[Attacker sends ssh-add -s malicious.so] --> B[Request forwarded to victim's ssh-agent]
B --> C[ssh-agent calls dlopen on malicious.so]
C --> D[Constructor function executes immediately]
D --> E[Arbitrary code runs on victim machine]
### 3.3 Анализ потока атак```mermaid
sequenceDiagram
participant V as Victim
participant A as Attacker
participant Agent as ssh-agent
participant Lib as Malicious .so
V->>A: ssh -A attacker@host
Note over V,A: Agent forwarding enabled
A->>Agent: ssh-add -s /path/to/malicious.so
Agent->>Lib: dlopen("/path/to/malicious.so")
Note over Lib: Constructor executes
Lib->>V: Malicious code runs
Note over V: System compromised
На самом низком уровне последовательность событий включает:
ssh-add -s /path/to/lib.sossh-agent получает этот запрос и слепо вызывает dlopen("/path/to/lib.so", RTLD_NOW).so имеет функцию-конструктор (__attribute__((constructor))), она выполняется сразу после загрузки