Античиты против ИИ‑помощников на собеседованиях - почему это не работает
ИИ помощникам на IT собесах конец! Или нет?
Привет! Я разработчик ИИ-помощника ХакСобеса by ilovehackit
В этой статье мы пройдемся по ключевым тезисам Античита против ИИ‑помощников на IT собеседованиях, а также заглянем в исходный код, разбираясь как оно устроено под капотом
Наливайте чаю, будет интересно!
Дисклеймер
Материал публикуется в исследовательских и образовательных целях. Я не призываю обходить проверки безопасности и не поддерживаю противоправные действия. Все примеры приведены для повышения осведомлённости и улучшения практик безопасности
Общее впечатление по исходному коду
Перво, что бросается в глаза - софт написан с помощью вайб‑кодинга, потому что только Ai генерирует эмодзи в console.log
, а по проекту они практически везде
console.error('❌ find-process failed:', error);
console.log('🛑 Stopping enhanced process tracking...');
console.log('⚠️ Enhanced process tracking already active');
console.error('❌ Failed to take process snapshot:', error);
При этом комменты к коду почему‑то на русском?!
// Определяем путь к HTML файлу в зависимости от режима (dev/prod)
// Проверяем, является ли ошибка retryable
// Последняя попытка не удалась
// Не retryable ошибка, не пытаемся снова
// Дополнительные обработчики событий
// Обработка необработанных исключений в renderer процессе
Тезис “Античит отслеживает скриншоты”
Вот сам код - как софт это отслеживает
if (process.platform === 'darwin') {
// macOS shortcuts
globalShortcut.register('CommandOrControl+Shift+3', () => {
this.addScreenshotAttempt();
});
globalShortcut.register('CommandOrControl+Shift+4', () => {
this.addScreenshotAttempt();
});
globalShortcut.register('CommandOrControl+Shift+5', () => {
this.addScreenshotAttempt();
});
} else {
// Windows shortcuts
globalShortcut.register('PrintScreen', () => {
this.addScreenshotAttempt();
});
globalShortcut.register('Alt+PrintScreen', () => {
this.addScreenshotAttempt();
});
globalShortcut.register('CommandOrControl+PrintScreen', () => {
this.addScreenshotAttempt();
});
globalShortcut.register('CommandOrControl+Shift+S', () => {
this.addScreenshotAttempt();
});
}
Достаточно просто переназначить на любую клавишу, которая не совпадает с этим списком, и проверка будет успешно пройдена
Тезис “Отслеживание движений мышки”
Код отслеживания
private startMouseTracking(): void {
console.log('🖱️ Starting mouse tracking...');
this.mouseInterval = setInterval(() => {
if (!this.isTracking) return;
try {
const mousePos = screen.getCursorScreenPoint();
this.addMouseMoveEvent({ x: mousePos.x, y: mousePos.y });
} catch (error) {
console.error('❌ Error getting mouse position:', error);
console.error('This might be due to macOS accessibility permissions');
}
}, 500);
}
Каждые 500ms фиксируются координаты расположения курсора. Любой ИИ‑помощник, включая ХакСобес, не требует использования мыши
Тезис “Отслеживание всех действий кандидата"
Давайте заглянем в исходный код
public setupMouseClickTracking(browserWindow: BrowserWindow): void {
const mouseClickScript = `
...
document.addEventListener('keydown', (e) => {
console.log('Key down detected:', e.key);
window.electronAPI.activityTracker.keyDown({code: e.code, shift: e.shiftKey, ctrl: e.ctrlKey, alt: e.altKey, meta: e.metaKey})
.then(() => console.log('✅ Key down sent to main process'))
.catch(err => console.error('❌ Failed to send key down:', err));
});
...
`;
browserWindow.webContents
.executeJavaScript(mouseClickScript)
.catch((error) => {
console.error('Failed to inject mouse click tracking:', error);
});
}
Идея в том, что после открытия ссылки во внутреннем браузере, происходит инъекция JS‑кода в страницу, который как раз и отслеживает нажатия на клавиши и клики. Простой способ обойти - это запатчить клиента и закомментировать этот код
Тезис “Отслеживание, что софт запущен в VM и даже виртуалка не поможет”
Смотрим на исходный код
const allData = await si.getStaticData();
const stringData = JSON.stringify({
version: allData.version,
system: allData.system,
bios: allData.bios,
baseboard: allData.baseboard,
chassis: allData.chassis,
os: allData.os,
uuid: allData.uuid,
cpu: allData.cpu,
graphics: allData.graphics,
net: allData.net,
memLayout: allData.memLayout,
diskLayout: allData.diskLayout,
});
if (stringData.includes('virtualbox"') || stringData.includes('vbox')) {
isVirtual = true;
virtualHost = 'VirtualBox';
} else if (stringData.includes('vmware')) {
isVirtual = true;
virtualHost = 'VMware';
} else if (stringData.includes('hyperv')) {
isVirtual = true;
virtualHost = 'Hyper-V';
} else if (stringData.includes('kvm')) {
isVirtual = true;
virtualHost = 'KVM';
} else if (stringData.includes('qemu')) {
isVirtual = true;
virtualHost = 'QEMU';
}
Берем любой продвинутый VM, редактируем конфигурационный файл и удаляем триггерные строки, вуаля, теперь мы запустились не в VM. Ну или просто находим такую VM, которой нет в этом списке. А еще можно взять любой Open Source, отредактировать его название и создатель этого античита никогда не сможет найти вас!
Но это не все! Есть еще второй способ обнаружения виртуальной машины — по выделенным ресурсам
// Check for suspicious parameters
const isSuspiciousRAM = systemResources && systemResources.ramGB <= 2;
const isSuspiciousDisk =
systemResources && systemResources.diskSpaceGB <= 100;
const isSuspiciousCores = systemResources && systemResources.cpuCores <= 3;
const isSuspiciousMonitors = displayCount >= 2;
const hasSuspiciousSpecs =
isSuspiciousRAM ||
isSuspiciousDisk ||
isSuspiciousCores ||
isSuspiciousMonitors;
Чек-лист обхода проверок:
- Выделить 2+ GB RAM
- Выделить 100+ GB Диска
- Выделить 3+ CPU CORE
- Не использовать второй монитор
Тезис “Отслеживание запущенных ИИ‑помощников”
Исходный код
private isSuspiciousProcess(name: string, cmd: string, bin: string): boolean {
return suspiciousProcesses.some((pattern) => {
if (pattern.length > 3) {
return (
name.toLowerCase().includes(pattern) ||
cmd.toLowerCase().includes(pattern) ||
bin?.toLowerCase().includes(pattern)
);
}
return (
name.toLowerCase() === pattern ||
cmd.toLowerCase() === pattern ||
bin?.toLowerCase() === pattern
);
});
}
Просто поиск по названию процесса из захардкоженного списка
export const suspiciousProcesses = [
// AI assistants and chatbots
'хаксобес',
'ilovehackit',
'chatgpt',
'claude',
'bard',
'copilot',
'cluely',
...
];
Переименовать процесс что на macOS, что на Windows - несложно
Безопасность Античита
Видимо разработчик пренебрёг практиками безопасности и превратил софт в потенциально уязвимый клиентский браузер с хаотичным включением/выключением критичных флагов
Сейчас мы разберем что тут не так:
app.commandLine.appendSwitch('--ignore-certificate-errors');
app.commandLine.appendSwitch('--ignore-ssl-errors');
app.commandLine.appendSwitch('--ignore-certificate-errors-spki-list');
app.commandLine.appendSwitch('--disable-web-security');
app.commandLine.appendSwitch('--allow-running-insecure-content');
Зачем нам безопасность внутреннего браузера? Давайте игнорить все ошибки! Игнорим ошибки SSL, игнорим ошибки сертификатов, разрешаем без спроса выполняться небезопасному коду! Безопасность - зачем, выключаем?! Шикарно!
Потенциальная уязвимость софта
Есть вот такой интересный код
browserWindow.webContents.setWindowOpenHandler(({ url }) => {
if (url.startsWith('zoomus://')) {
return { action: 'deny' };
}
shell.openExternal(url);
return { action: 'deny' };
});
Он проверяет, можно ли во внутреннем браузере открыть ссылку. Видим, что запрещаются ТОЛЬКО ссылки с префиксом zoomus://
Есть второй дополняющий код, открывающий доступ ко всем компонентам вашего ПК во внутреннем браузере
session.defaultSession.setPermissionRequestHandler((webContents, permission, callback) => {
const allowedPermissions = ['camera','microphone','notifications','display-capture','media','mediaKeySystem','geolocation','fullscreen','pointerLock'];
callback(allowedPermissions.includes(permission));
});
Этот кусок кода открывает доступ КО ВСЕМУ пашему ПК во внутреннем браузере
- Вашему экрану
- Микрофону
- Видео-камере
- Гео-локации и тд
А теперь сама уязвимость
Вы — интервьюер, притворяетесь крупной компанией, кандидат ставит этот «Античит», вы кидаете ему фишинговую ссылку, он её открывает — и в ваших руках все перечисленные выше данные кандидата
Это иллюстрация риска социальной инженерии + небезопасного софта
В софте есть еще пяток реальных эксплойтов, но их намеренно не буду раскрывать в статье. На всякий случай. Кто знает, всякое может быть в будущем. Раз уж разработчик софта решил взять на себя роль корпоративного героя!
Заключение
Я крайне не рекомендую устанавливать такой софт на свой ПК
А если какие-то компании начали это внедрять и просят поставить - откажитесь: высок риск фишинга или иной социальной инженерии. Оно вам надо?
Путь такого рода софта обречён на провал по простой причине - риски от недобросовестных людей. Сегодня вас попросила поставить этот софт одна компания, а завтра — фишинговый софт от злоумышленника, притворившегося крупным банком (скамер)
Кто будет виноват в этой ситуации?
Кто окажется в проигрыше - ВЫ!
Ну и вторая причина, почему любой такой софт обречен на провал:
Все что на клиенте - можно обойти
Удачи на собеседованиях и подписывайся на ХакСобес в Telegram