mirror of
https://github.com/BigBodyCobain/Shadowbroker.git
synced 2026-06-10 16:24:02 +02:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c8fdfbdceb | |||
| bb7d7f6f83 |
+33
-11
@@ -20,10 +20,15 @@
|
|||||||
# Auth notes:
|
# Auth notes:
|
||||||
# - The image build/push uses $CI_JOB_TOKEN, which GitLab provides
|
# - The image build/push uses $CI_JOB_TOKEN, which GitLab provides
|
||||||
# automatically. No credentials need to be configured.
|
# automatically. No credentials need to be configured.
|
||||||
# - The reverse mirror requires a GitHub personal access token stored
|
# - The reverse mirror authenticates to GitHub via a per-repo SSH
|
||||||
# as the GitLab CI/CD variable GITHUB_MIRROR_TOKEN (Protected + Masked).
|
# deploy key. The private half is stored as the File-type GitLab
|
||||||
# Scope: public_repo (or repo for private). If the variable isn't
|
# CI/CD variable GITHUB_MIRROR_SSH_KEY (Protected). The matching
|
||||||
# set the mirror job is skipped — image builds still run.
|
# public key is added to github.com/BigBodyCobain/Shadowbroker/
|
||||||
|
# settings/keys with write access. This is a tighter-scoped
|
||||||
|
# replacement for a personal access token: it can ONLY push to
|
||||||
|
# Shadowbroker, never expires, and rotating it is a one-click
|
||||||
|
# delete on GitHub's deploy-keys page. If the variable isn't set,
|
||||||
|
# the mirror job is skipped — image builds still run.
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- build
|
- build
|
||||||
@@ -101,18 +106,35 @@ build-frontend:
|
|||||||
- .gitlab-ci.yml
|
- .gitlab-ci.yml
|
||||||
|
|
||||||
# ── Reverse mirror to GitHub ─────────────────────────────────────────────
|
# ── Reverse mirror to GitHub ─────────────────────────────────────────────
|
||||||
# Pushes refs/heads/main to github.com/BigBodyCobain/Shadowbroker.
|
# Pushes refs/heads/main to github.com/BigBodyCobain/Shadowbroker via SSH
|
||||||
# Fast-forward-only — if GitLab main and GitHub main have diverged, this
|
# using a per-repo deploy key. Fast-forward-only by default — if GitLab
|
||||||
# fails loudly rather than silently overwriting either side.
|
# main and GitHub main have diverged, the push fails loudly rather than
|
||||||
|
# silently overwriting either side.
|
||||||
#
|
#
|
||||||
# Only runs if GITHUB_MIRROR_TOKEN is set as a CI/CD variable. See the
|
# Only runs if GITHUB_MIRROR_SSH_KEY is set as a File-type CI/CD variable.
|
||||||
# header comment of this file for setup instructions.
|
# See the header comment of this file for setup instructions.
|
||||||
mirror-to-github:
|
mirror-to-github:
|
||||||
stage: mirror
|
stage: mirror
|
||||||
image: alpine:3.20
|
image: alpine:3.20
|
||||||
needs: []
|
needs: []
|
||||||
before_script:
|
before_script:
|
||||||
- apk add --no-cache git openssh-client ca-certificates
|
- apk add --no-cache git openssh-client ca-certificates
|
||||||
|
- mkdir -p ~/.ssh
|
||||||
|
- chmod 700 ~/.ssh
|
||||||
|
# Install the deploy key. File-type CI variable exposes the path; copy
|
||||||
|
# to ~/.ssh/id_ed25519 with restrictive perms so ssh accepts it.
|
||||||
|
- cp "$GITHUB_MIRROR_SSH_KEY" ~/.ssh/id_ed25519
|
||||||
|
- chmod 600 ~/.ssh/id_ed25519
|
||||||
|
# Pin github.com's current host keys so we never trust a man-in-the-
|
||||||
|
# middle. Sourced from https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints
|
||||||
|
# (rotated 2023-03-24 after the previous RSA key leak).
|
||||||
|
- |
|
||||||
|
cat > ~/.ssh/known_hosts <<'EOF'
|
||||||
|
github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl
|
||||||
|
github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=
|
||||||
|
github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=
|
||||||
|
EOF
|
||||||
|
- chmod 644 ~/.ssh/known_hosts
|
||||||
script:
|
script:
|
||||||
- git config --global user.email "ci-mirror@gitlab.com"
|
- git config --global user.email "ci-mirror@gitlab.com"
|
||||||
- git config --global user.name "GitLab CI Mirror"
|
- git config --global user.name "GitLab CI Mirror"
|
||||||
@@ -123,7 +145,7 @@ mirror-to-github:
|
|||||||
- cd repo
|
- cd repo
|
||||||
- >
|
- >
|
||||||
git push
|
git push
|
||||||
"https://x-access-token:${GITHUB_MIRROR_TOKEN}@github.com/BigBodyCobain/Shadowbroker.git"
|
"git@github.com:BigBodyCobain/Shadowbroker.git"
|
||||||
"${CI_COMMIT_SHA}:refs/heads/main"
|
"${CI_COMMIT_SHA}:refs/heads/main"
|
||||||
rules:
|
rules:
|
||||||
- if: $CI_COMMIT_BRANCH == "main" && $GITHUB_MIRROR_TOKEN
|
- if: $CI_COMMIT_BRANCH == "main" && $GITHUB_MIRROR_SSH_KEY
|
||||||
|
|||||||
@@ -92,18 +92,37 @@ SECRET_REGEX+='pypi-[0-9a-zA-Z-]{50,}' # PyPI token
|
|||||||
TEXT_FILES=$(grep -ivE '\.(png|jpg|jpeg|gif|ico|svg|woff2?|ttf|eot|pbf|zip|tar|gz|db|sqlite|xlsx|pdf|mp[34]|wav|ogg|webm|webp|avif)$' "$FILELIST" | grep -v 'scan-secrets\.sh$' || true)
|
TEXT_FILES=$(grep -ivE '\.(png|jpg|jpeg|gif|ico|svg|woff2?|ttf|eot|pbf|zip|tar|gz|db|sqlite|xlsx|pdf|mp[34]|wav|ogg|webm|webp|avif)$' "$FILELIST" | grep -v 'scan-secrets\.sh$' || true)
|
||||||
|
|
||||||
if [[ -n "$TEXT_FILES" ]]; then
|
if [[ -n "$TEXT_FILES" ]]; then
|
||||||
|
# Known-public exclusions: lines matching `<host-or-ip> ssh-<algo> <key>`
|
||||||
|
# are SSH known_hosts entries — the host's PUBLIC fingerprint, which is
|
||||||
|
# by definition safe to commit (the whole point of pinning known_hosts
|
||||||
|
# is to publish the fingerprint widely so MITM is detectable). Filter
|
||||||
|
# these out before flagging the file.
|
||||||
|
KNOWN_HOSTS_LINE='^[[:space:]]*[a-zA-Z0-9._:,*-]+([[:space:]]+[a-zA-Z0-9._:,*-]+)?[[:space:]]+(ssh-rsa|ssh-ed25519|ssh-dss|ecdsa-sha2-nistp256|ecdsa-sha2-nistp384|ecdsa-sha2-nistp521)[[:space:]]+AAAA'
|
||||||
|
|
||||||
# Use grep with file list, skip missing/binary, limit output
|
# Use grep with file list, skip missing/binary, limit output
|
||||||
CONTENT_HITS=$(echo "$TEXT_FILES" | xargs grep -lE "$SECRET_REGEX" 2>/dev/null || true)
|
CONTENT_HITS=$(echo "$TEXT_FILES" | xargs grep -lE "$SECRET_REGEX" 2>/dev/null || true)
|
||||||
if [[ -n "$CONTENT_HITS" ]]; then
|
if [[ -n "$CONTENT_HITS" ]]; then
|
||||||
echo -e "\n${RED}BLOCKED: Embedded secrets/tokens found in:${NC}"
|
REAL_HITS=""
|
||||||
echo "$CONTENT_HITS" | while read -r f; do
|
REAL_REPORT=""
|
||||||
echo -e " ${RED}$f${NC}"
|
while IFS= read -r f; do
|
||||||
# Show first matching line for context
|
[[ -z "$f" ]] && continue
|
||||||
grep -nE "$SECRET_REGEX" "$f" 2>/dev/null | head -2 | while read -r line; do
|
# Re-grep this file, but filter out known_hosts-style lines.
|
||||||
echo -e " ${YELLOW}$line${NC}"
|
FILE_HITS=$(grep -nE "$SECRET_REGEX" "$f" 2>/dev/null | grep -vE "$KNOWN_HOSTS_LINE" || true)
|
||||||
done
|
if [[ -n "$FILE_HITS" ]]; then
|
||||||
done
|
REAL_HITS+="$f"$'\n'
|
||||||
FOUND=1
|
REAL_REPORT+=" ${RED}$f${NC}"$'\n'
|
||||||
|
# Show first 2 matching lines for context
|
||||||
|
while IFS= read -r line; do
|
||||||
|
[[ -z "$line" ]] && continue
|
||||||
|
REAL_REPORT+=" ${YELLOW}$line${NC}"$'\n'
|
||||||
|
done < <(echo "$FILE_HITS" | head -2)
|
||||||
|
fi
|
||||||
|
done <<< "$CONTENT_HITS"
|
||||||
|
if [[ -n "$REAL_HITS" ]]; then
|
||||||
|
echo -e "\n${RED}BLOCKED: Embedded secrets/tokens found in:${NC}"
|
||||||
|
echo -en "$REAL_REPORT"
|
||||||
|
FOUND=1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user