Как защитить уязвимость чтобы она эксплуатировалась но злоумышленник не мог ничего сделать?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Security: невредоносность за счёт изоляции
Это хитрый вопрос о защите в глубину (defense in depth). Идея: даже если уязвимость будет найдена и эксплуатирована, её влияние должно быть минимальным. Это не о предотвращении уязвимостей, а о контроле ущерба.
Принцип наименьших привилегий
Главная стратегия — ограничить то, что может сделать даже скомпрометированный код. Это как дать злоумышленнику доступ в комнату, но заранее убрать оттуда всё ценное.
// ДА: изолированная функция с минимальными привилегиями
function processUserInput(input) {
// 1. Валидация и санитизация
const sanitized = DOMPurify.sanitize(input);
// 2. Ограничиваем scope и доступ
const result = computeInWorker(sanitized);
// 3. Возвращаем только необходимое
return { status: 'ok', data: result };
}
// НЕТ: функция с полным доступом
function dangerousProcessing(input) {
// Имеет доступ ко всему объекту window
console.log(localStorage); // Уязвимо
fetch('/api/admin'); // Уязвимо
}
Принцип разделения ответственности и изоляции
Разделяй код на компоненты с чётко определёнными границами. Если один скомпрометирован, ущерб ограничивается его scope:
// Архитектура с изоляцией
const AuthService = {
// Единственное место, которое может изменять токены
setToken(token) {
if (!this.isValidToken(token)) throw new Error('Invalid token');
this.token = token; // Private
},
// Другие части кода не могут напрямую менять токен
getToken() {
return this.token;
}
};
// Даже если XSS попадёт в UI компонент,
// она не сможет напрямую украсть токен благодаря инкапсуляции
Content Security Policy (CSP)
CSP — это браузерная политика безопасности, которая определяет, откуда могут загружаться ресурсы и что может исполняться:
// На сервере (Express, Nextjs, etc)
app.use((req, res, next) => {
res.setHeader('Content-Security-Policy', `
default-src 'self';
script-src 'self' 'unsafe-inline' cdnjs.cloudflare.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
font-src 'self' fonts.googleapis.com;
connect-src 'self' https://api.example.com;
frame-ancestors 'none';
base-uri 'self';
form-action 'self';
`);
next();
});
// Эффект:
// - Если XSS выполнит eval() — не сработает
// - Если XSS попытается загрузить данные с чужого сервера — заблокируется
// - Если попытается открыть iframe — не сработает
Sandbox для untrusted кода
Для выполнения потенциально опасного пользовательского кода используй Web Workers или iframe с sandbox:
<!-- Изолированный iframe без привилегий -->
<iframe
id="sandbox"
sandbox="allow-scripts"
src="untrusted-content.html"
></iframe>
<script>
// Этот iframe не может:
// - Получить доступ к localStorage родителя
// - Выполнить fetch с credentials
// - Открыть новые окна
// - Получить доступ к localStorage
// - Выполнить плагины
// Единственный способ общения — postMessage
const frame = document.getElementById('sandbox');
frame.contentWindow.postMessage({ type: 'init', data: {} }, '*');
</script>
Или Web Worker:
// main.js
const worker = new Worker('untrusted-worker.js');
worker.onmessage = (event) => {
console.log('Result:', event.data);
};
worker.postMessage({ input: userInput });
// untrusted-worker.js
// Выполняется в полностью изолированном контексте
// Не имеет доступа к DOM, localStorage, fetch и т.д.
self.onmessage = (event) => {
// Может только вычислять и отправлять результат
const result = process(event.data.input);
self.postMessage(result);
};
Принцип defense in depth (защита в глубину)
// Уровень 1: На краю — валидация и санитизация
const input = sanitize(userInput);
// Уровень 2: Минимальные привилегии функций
const processData = (() => {
// Замыкание ограничивает доступ
const cache = new Map();
return (data) => cache.get(data);
})();
// Уровень 3: CSP блокирует опасные операции
// (браузер, не JavaScript)
// Уровень 4: Изоляция критичного кода
const criticalService = new Proxy(originalService, {
set: () => {
throw new Error('Cannot modify critical service');
}
});
// Уровень 5: Мониторинг и логирование
const handler = {
set(target, prop, value) {
if (suspiciousPattern(prop, value)) {
reportSecurityEvent({ prop, value });
}
return Reflect.set(target, prop, value);
}
};
Шифрование и хеширование чувствительных данных
// Никогда не храни токены в plain text в localStorage
// Вместо этого используй httpOnly cookies (серверная сторона)
// На клиенте:
fetch('/api/auth/login', {
credentials: 'include' // Автоматически отправляет httpOnly cookies
});
// На сервере (Express):
res.cookie('authToken', token, {
httpOnly: true, // JS не может получить доступ
secure: true, // Только по HTTPS
sameSite: 'strict' // Защита от CSRF
});
Проверка зависимостей и supply chain
# Регулярно проверяй уязвимости в зависимостях
npm audit
# Обновляй пакеты
npm update
# Используй лок-файлы для reproducible builds
# git commit package-lock.json
Вывод: безопасность это не о предотвращении всех уязвимостей (невозможно), а о защите от их последствий. Используй многоуровневую защиту: валидация, изоляция, CSP, минимальные привилегии, мониторинг.