Please report suspected security issues privately using GitHub's private vulnerability reporting (the Report a vulnerability button under the repository's Security tab). Please do not open a public issue for security reports.
gogo runs commands across many repositories on your behalf. Two commands run arbitrary shell commands by design:
gogo exec "<command>"runs the command you pass.gogo run <name>runs a command defined in thecommandssection of the.gogofile.
Because gogo run executes whatever a project's .gogo defines, running it
in a repository means trusting that repository's authors — the same trust you
extend to npm run, a Makefile, or a git hook. Only run gogo in
meta-repositories you trust, and review a cloned or shared .gogo (its
commands and projects) before running gogo run, gogo git update, or
gogo git clone.
- Config discovery is ownership-checked. gogo searches parent directories
for a
.gogo, but refuses one that is not owned by the current user, so it does not silently adopt a config planted by another user in a shared parent directory (for example/tmp). - SSH host keys are never added automatically. gogo warns about unknown
hosts and leaves host-key verification to you (or to
ssh's own prompt); it does not runssh-keyscanand trust whatever key the network returns. - Git URLs are validated. URLs from the config and CLI are rejected if they
begin with
-or use a remote-helper transport such asext::, which git would otherwise execute as a command. - Local npm links stay inside the project.
gogo npm link --allwill not follow a crafted dependency name or a symlinkednode_modulesout of the repository. - Child output is sanitized. Control characters and escape sequences in a command's output cannot forge gogo's own status lines.
These protections stop another party from injecting a config or command into
your session. They do not vet the contents of a config you choose to run: a
.gogo you own, or one inside a repository you cloned, can still define
commands that run with your privileges. Review before you run.
The published image runs as root so it can operate on mounted working copies. When mounting a repository you own, run the container as your own user so gogo does not act as root and file ownership stays intact:
docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/work" -w /work \
ghcr.io/dafish/gogo-meta:latest git status