Античиты против ИИ‑помощников на собеседованиях - почему это не работает

    ИИ помощникам на 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;

    Чек-лист обхода проверок:

    1. Выделить 2+ GB RAM
    2. Выделить 100+ GB Диска
    3. Выделить 3+ CPU CORE
    4. Не использовать второй монитор

    Тезис “Отслеживание запущенных ИИ‑помощников”

    Исходный код

    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));
    });

    Этот кусок кода открывает доступ КО ВСЕМУ пашему ПК во внутреннем браузере

    1. Вашему экрану
    2. Микрофону
    3. Видео-камере
    4. Гео-локации и тд

    А теперь сама уязвимость

    Вы — интервьюер, притворяетесь крупной компанией, кандидат ставит этот «Античит», вы кидаете ему фишинговую ссылку, он её открывает — и в ваших руках все перечисленные выше данные кандидата

    Это иллюстрация риска социальной инженерии + небезопасного софта

    В софте есть еще пяток реальных эксплойтов, но их намеренно не буду раскрывать в статье. На всякий случай. Кто знает, всякое может быть в будущем. Раз уж разработчик софта решил взять на себя роль корпоративного героя!

    Заключение

    Я крайне не рекомендую устанавливать такой софт на свой ПК

    А если какие-то компании начали это внедрять и просят поставить - откажитесь: высок риск фишинга или иной социальной инженерии. Оно вам надо?

    Путь такого рода софта обречён на провал по простой причине - риски от недобросовестных людей. Сегодня вас попросила поставить этот софт одна компания, а завтра — фишинговый софт от злоумышленника, притворившегося крупным банком (скамер)

    Кто будет виноват в этой ситуации?

    Кто окажется в проигрыше - ВЫ!

    Ну и вторая причина, почему любой такой софт обречен на провал:

    Все что на клиенте - можно обойти

    Удачи на собеседованиях и подписывайся на ХакСобес в Telegram

    Читайте также