CVE-2025-11953 — уязвимость, которая позволяет неаутентифицированным пользователям выполнять произвольные команды оболочки (RCE) или запускать произвольные исполняемые файлы в пакете
@react-native-community/cli-server-api версий с 4.8.0 по 20.0.0-alpha.2😳 Метрики
Base Score: 9,8 (CRITICAL)
CWE: CWE-78
😳 Об уязвимости
Не подвержены уязвимости разработчики, которые используют React Native с фреймворком, но не берут Metro в качестве сервера разработки. В уязвимых версиях
@react-native-community/cli-server-api функция openURLMiddleware содержит код:async function openURLMiddleware(req: IncomingMessage, ...) {
if (req.method === 'POST') {
…
const {url} = req.body as {url: string};
await open(url);
…
}
next();
}
export default connect().use(json()).use(openURLMiddleware);Значение параметра url, отправленного в JSON теле POST-запроса, предаётся в open() без надлежащий валидации.
Исправление:
try {
const parsedUrl = new URL(url);
if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') {
res.writeHead(400);
res.end('Invalid URL protocol');
return;
}
} catch (error) {
res.writeHead(400);
res.end('Invalid URL format');
return;
}
await open(url);Исправление проверяет, что параметр url означает именно URL в
new URL с протоколом http/https в if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:').💡 Дополнительная особенность уязвимости — сервер по умолчанию будет прослушивать внешние соединения
0.0.0.0:[port].Важно: поведение
open() отличается между Windows и Unix подобными системами.☀️ На Windows уязвимости RCE возникают из за формирования одной строковой команды. Например,
cmd /c start "" /b cmd /c echo abc > c:\temp\pwned.txt.☀️ На macOS/Linux open/xdg-open запускаются без shell и ожидает, что каждый аргумент будет отдельной строкой, но остаются другие риски (URI обработчики, file://, сетевые схемы).
Короче: Windows — риск RCE через командную строку, macOS/Linux — риск через URI обработчики и
file:/// smb://.Уязвимая конечная точка:
/open-url.😳 Пример эксплуатации RCE для Windows
curl -X POST http://metro-server-host:8081/open-url -H "Content-Type: application/json" -d "{\"url\":\"cmd /c echo abc ^> c:\\temp\\poc.txt\"}"😳 Как защищаться
1) Обновиться.
2) Запускать сервер строго на localhost.
3) Написать блокирующее правило (IDS/WAF) на POST-запросы, которые идут к конечной точке /open-url, где в качестве значения параметра url передается строка отличная от http(s)://[domain].[exp].