Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
60bcd0f
feat(binary-codec): add XLS-96 confidential MPT field and transaction…
kpitapeersyst Mar 17, 2026
cab9de4
chore: add XLS-96 confidential MPT definitions to unreleased changelog
kpitapeersyst Mar 17, 2026
b2f2aac
feat(xrpl): add XLS-96 confidential transfer fields to MPToken and MP…
kpitapeersyst Mar 18, 2026
e680fa9
refactor(xrpl): rename XLS-96 confidential transfer fields to match u…
kpitapeersyst Mar 20, 2026
4cb7921
fix(xrpl): align XLS-96 MPTokenIssuanceSet with rippled spec
kpitapeersyst Mar 20, 2026
0180c89
Merge branch 'xrpl/feat/dynamic-mpt-xls-94' into binary-codec/feat/co…
kpitapeersyst Mar 24, 2026
f23b97d
Merge branch 'binary-codec/feat/confidential-transfers' into xrpl/fea…
kpitapeersyst Mar 24, 2026
ea525e0
Merge branch 'xrpl/feat/confidential-transfers' into xrpl/feat/confid…
kpitapeersyst Mar 24, 2026
5f9c0ff
style: gofumpt formatting
kpitapeersyst Mar 24, 2026
571e0b1
Merge branch 'xrpl/feat/confidential-transfers' into xrpl/feat/confid…
kpitapeersyst Mar 24, 2026
d6699e3
feat(xrpl): add ConfidentialMPTClawback transaction type
kpitapeersyst Mar 24, 2026
9315cf2
feat(xrpl): add ConfidentialMPTConvert transaction type
kpitapeersyst Mar 24, 2026
5228a05
feat(xrpl): add ConfidentialMPTConvertBack transaction type
kpitapeersyst Mar 24, 2026
4d9e60a
feat(xrpl): add ConfidentialMPTMergeInbox transaction type
kpitapeersyst Mar 24, 2026
8b27c61
feat(xrpl): add ConfidentialMPTSend transaction type
kpitapeersyst Mar 24, 2026
b6a27fe
Merge branch 'xrpl/feat/dynamic-mpt-xls-94' into binary-codec/feat/co…
kpitapeersyst Mar 24, 2026
b6129a9
Merge branch 'binary-codec/feat/confidential-transfers' into xrpl/fea…
kpitapeersyst Mar 24, 2026
2f8205a
Merge branch 'xrpl/feat/confidential-transfers' into xrpl/feat/confid…
kpitapeersyst Mar 24, 2026
9fe2a21
docs: add XLS-96 confidential transfer changelog entries for xrpl pac…
kpitapeersyst Mar 24, 2026
8a5366b
Merge branch 'xrpl/feat/confidential-transfers' into xrpl/feat/confid…
kpitapeersyst Mar 24, 2026
6f550c2
docs: add XLS-96 confidential transfer transaction changelog entries
kpitapeersyst Mar 24, 2026
efa62f1
Merge branch 'xrpl/feat/confidential-transfers-transactions' into xrp…
kpitapeersyst Mar 24, 2026
692e057
docs: add XLS-96 confidential transaction types to changelog
kpitapeersyst Mar 24, 2026
04d9c19
refactor(xrpl): strengthen XLS-96 confidential tx field validation
kpitapeersyst Mar 24, 2026
ce2ac3d
refactor(xrpl): update error definitions for confidential tx validati…
kpitapeersyst Mar 24, 2026
db00219
fix(xrpl): correct ZKProof doc comment and add AuditorEncryptedAmount…
kpitapeersyst Mar 24, 2026
c29a421
style: align map value whitespace in MPTokenIssuanceSet test
kpitapeersyst Mar 25, 2026
ced1a97
Merge branch 'xrpl/feat/confidential-transfers-transactions' into xrp…
kpitapeersyst Mar 25, 2026
9667280
feat(confidential): add CGo setup with vendored mpt-crypto dependencies
kpitapeersyst Mar 25, 2026
4ca4f8d
test(confidential): use testify assertions in mptcrypto_test.go
kpitapeersyst Mar 25, 2026
df8e4ca
feat(confidential): add ElGamal encrypt/decrypt with hex-string API
kpitapeersyst Mar 25, 2026
b349d6d
docs: add ElGamal and hexutil changelog entries
kpitapeersyst Mar 25, 2026
cc50b72
refactor: remove unneeded flag setters
kpitapeersyst Mar 26, 2026
d495680
Merge branch 'confidential-transfers' into binary-codec/feat/confiden…
JordiParraCrespo Mar 26, 2026
471a346
Merge pull request #227 from XRPLF/binary-codec/feat/confidential-tra…
JordiParraCrespo Mar 26, 2026
0a5fe4e
Merge branch 'confidential-transfers' into xrpl/feat/confidential-tra…
JordiParraCrespo Mar 26, 2026
3e28b7a
Merge pull request #228 from XRPLF/xrpl/feat/confidential-transfers
JordiParraCrespo Mar 26, 2026
0cf28ba
Merge branch 'confidential-transfers' of github.com:XRPLF/xrpl-go int…
JordiParraCrespo Mar 26, 2026
5bef406
fix(xrpl): array size of matrix
JordiParraCrespo Mar 26, 2026
92529df
Merge pull request #229 from XRPLF/xrpl/feat/confidential-transfers-t…
JordiParraCrespo Mar 26, 2026
3749f99
Merge branch 'confidential-transfers' into xrpl/feat/confidential-tra…
JordiParraCrespo Mar 26, 2026
66a42a2
refactor(xrpl): remove MPTPlainAmount.UnmarshalJSON in favor of Unmar…
kpitapeersyst Mar 26, 2026
c8ea4d1
Merge pull request #230 from XRPLF/xrpl/feat/confidential-transfers-n…
JordiParraCrespo Mar 26, 2026
6e92705
feat(confidential): add commitment, proof, and context-hash CGo bindings
kpitapeersyst Mar 26, 2026
734bc82
feat(confidential): add commitment, proof, and context-hash hex-strin…
kpitapeersyst Mar 26, 2026
65ed5d6
refactor(confidential): rename package proofs -> proof
kpitapeersyst Mar 26, 2026
614d1db
Merge branch 'confidential-transfers' into confidential/feat/cgo-setup
JordiParraCrespo Mar 30, 2026
dc8b114
fix: use more restrictive cgo directive
kpitapeersyst Mar 31, 2026
33cca88
ci: use ubuntu-22.04 for mptcrypto to improve compatibility
kpitapeersyst Mar 31, 2026
425e3b8
Merge pull request #231 from XRPLF/confidential/feat/cgo-setup
JordiParraCrespo Mar 31, 2026
ebd425c
Merge branch 'confidential-transfers' into confidential/feat/elgamal-…
JordiParraCrespo Mar 31, 2026
439dff4
fix: use more restrictive cgo directive
kpitapeersyst Mar 31, 2026
466209f
refactor(confidential): rename elgamal error sentinels to cover all v…
kpitapeersyst Apr 1, 2026
d912ee0
fix(confidential): guard GetSendProofSize against negative input
kpitapeersyst Apr 1, 2026
29c5344
fix(confidential): update README and simplify zeroHex helper
kpitapeersyst Apr 1, 2026
df79a7e
Merge branch 'confidential/feat/elgamal-keypair' into confidential/fe…
kpitapeersyst Apr 1, 2026
e3806e4
refactor(confidential): rename proof error sentinels to cover all val…
kpitapeersyst Apr 1, 2026
1e1c72a
fix(confidential): validate send proof length against expected size
kpitapeersyst Apr 1, 2026
a49b9d6
refactor(confidential): rename HexParticipant and HexProofParams proo…
kpitapeersyst Apr 1, 2026
1d27dfd
fix(confidential): reject empty participants slice in proof functions
kpitapeersyst Apr 1, 2026
623632e
test(confidential): update proof tests for empty participants validation
kpitapeersyst Apr 1, 2026
d0ee46d
Merge pull request #232 from XRPLF/confidential/feat/elgamal-keypair
JordiParraCrespo Apr 2, 2026
2967ffe
Merge branch 'confidential-transfers' into confidential/feat/zkproof
JordiParraCrespo Apr 2, 2026
da53339
Merge pull request #235 from XRPLF/confidential/feat/zkproof
JordiParraCrespo Apr 2, 2026
c3326e1
feat(confidential): create tx builders
kpitapeersyst Apr 8, 2026
87adeaf
docs: add confidential transfers documentation
kpitapeersyst Apr 8, 2026
daab02a
chore(confidential): update vendored mpt-crypto to 0.3.0-rc1
github-actions[bot] Apr 17, 2026
7138c42
chore: update vendored mpt-crypto to 0.3.0-rc1
kpitapeersyst Apr 17, 2026
08da98d
refactor: mpt_utility.h cgo functions
kpitapeersyst Apr 21, 2026
6620830
refactor: align wrapper functions with mpt-crypto changes
kpitapeersyst Apr 21, 2026
088cfd2
chore: update confidential mpt README
kpitapeersyst Apr 21, 2026
4d8ac31
test: match participants order
kpitapeersyst Apr 21, 2026
a18799c
refactor: strict proof size validation and rename remainder to balance
kpitapeersyst Apr 21, 2026
937171e
fix: enforce exact ZKProof sizes in confidential MPT
kpitapeersyst Apr 21, 2026
ffd0a90
fix: reject encryption keys with tmfMPTClearCanConfidentialAmount
kpitapeersyst Apr 21, 2026
e7520a5
Merge pull request #259 from kpitapeersyst/feat/update-mptcrypto
JordiParraCrespo Apr 22, 2026
cb15e6b
Merge remote-tracking branch 'origin/main' into pr-233-confidential-t…
kpitapeersyst Jul 23, 2026
a386a3a
chore(confidential): update vendored mpt-crypto to 1.0.2 (#338)
kpitapeersyst Jul 28, 2026
d118dfc
Merge branch 'main' into confidential-transfers
kpitapeersyst Jul 28, 2026
200d219
fix(confidential): restore bounded MPT decryption (#345)
kpitapeersyst Jul 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
394 changes: 394 additions & 0 deletions .github/workflows/update-mpt-crypto.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,394 @@
name: Build mpt-crypto

on:
workflow_dispatch:
inputs:
version:
description: "mpt-crypto version (leave empty for latest)"
required: false
default: ""
force:
description: "Rebuild even when the version or update branch already exists"
required: false
type: boolean
default: true
schedule:
- cron: "0 9 * * 1" # Every Monday at 9:00 UTC

permissions:
contents: read

jobs:
check:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.resolve.outputs.version }}
current: ${{ steps.resolve.outputs.current }}
needed: ${{ steps.resolve.outputs.needed }}
branch: ${{ steps.resolve.outputs.branch }}
steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false

- name: Install Conan
run: |
pip install "conan==2.26.2"
conan profile detect
conan remote add --index 0 xrplf https://conan.ripplex.io

- name: Resolve version and check if update needed
id: resolve
env:
REQUESTED_VERSION: ${{ inputs.version }}
FORCE_UPDATE: ${{ github.event_name == 'workflow_dispatch' && inputs.force }}
run: |
set -euo pipefail

CURRENT=$(cat confidential/deps/VERSION 2>/dev/null || echo "")
echo "current=$CURRENT" >> "$GITHUB_OUTPUT"

if [ -n "$REQUESTED_VERSION" ]; then
VERSION="$REQUESTED_VERSION"
else
VERSION=$(conan list 'mpt-crypto/*' -r xrplf --format=json \
| python3 -c '
import json
import re
import sys

packages = json.load(sys.stdin)
versions = [
reference.split("/", 1)[1]
for remote in packages.values()
for reference in remote
if reference.startswith("mpt-crypto/")
]
if not versions:
raise SystemExit("no mpt-crypto versions found")

def version_key(version):
match = re.fullmatch(r"(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?", version)
if not match:
raise SystemExit(f"unsupported mpt-crypto version format: {version}")
prerelease = match.group(4)
prerelease_key = tuple(
(0, int(part)) if part.isdigit() else (1, part)
for part in re.split(r"[.-]", prerelease or "")
)
return (*(int(match.group(index)) for index in range(1, 4)), prerelease is None, prerelease_key)

print(max(versions, key=version_key))
')
fi

if [[ ! "$VERSION" =~ ^[0-9A-Za-z][0-9A-Za-z._+-]*$ ]]; then
echo "::error::Invalid mpt-crypto version '$VERSION'"
exit 1
fi
echo "version=$VERSION" >> "$GITHUB_OUTPUT"

BUNDLE_COMPLETE=true
for platform in linux-amd64 linux-arm64 darwin-amd64 darwin-arm64; do
for archive in libmpt-crypto.a libsecp256k1.a libcrypto.a; do
[ -s "confidential/deps/libs/$platform/$archive" ] || BUNDLE_COMPLETE=false
done
done
for header in mpt_protocol.h secp256k1_mpt.h secp256k1.h utility/mpt_utility.h; do
[ -s "confidential/deps/include/$header" ] || BUNDLE_COMPLETE=false
done
if [ "$BUNDLE_COMPLETE" = true ] && ! cc \
-Iconfidential/deps/include \
-Iconfidential/deps/include/utility \
-x c -fsyntax-only - >/dev/null 2>&1 <<'EOF'; then
#include "mpt_utility.h"
int main(void) { return 0; }
EOF
BUNDLE_COMPLETE=false
fi

if [ "$FORCE_UPDATE" = "true" ]; then
BRANCH="chore/update-mpt-crypto-${VERSION}-run-${GITHUB_RUN_ID}"
echo "needed=true" >> "$GITHUB_OUTPUT"
echo "Forced rebuild requested for mpt-crypto/$VERSION."
else
BRANCH="chore/update-mpt-crypto-${VERSION}"
if git ls-remote --exit-code --heads origin "$BRANCH" >/dev/null 2>&1; then
echo "needed=false" >> "$GITHUB_OUTPUT"
echo "::warning::Branch '$BRANCH' already exists. Enable force to create a new update branch."
elif [ "$CURRENT" = "$VERSION" ] && [ "$BUNDLE_COMPLETE" = true ]; then
echo "needed=false" >> "$GITHUB_OUTPUT"
echo "Already at a complete mpt-crypto/$VERSION bundle — skipping build."
else
echo "needed=true" >> "$GITHUB_OUTPUT"
echo "Building mpt-crypto/$VERSION for bundle validation ($CURRENT -> $VERSION)."
fi
fi
echo "branch=$BRANCH" >> "$GITHUB_OUTPUT"

- name: Lock resolved Conan graph
if: steps.resolve.outputs.needed == 'true'
env:
MPT_CRYPTO_VERSION: ${{ steps.resolve.outputs.version }}
run: |
set -euo pipefail
mkdir -p .mpt-crypto-lock
cat > .mpt-crypto-lock/conanfile.txt <<EOF
[requires]
mpt-crypto/$MPT_CRYPTO_VERSION
EOF
conan lock create .mpt-crypto-lock/conanfile.txt \
-o "*:shared=False" \
-o "*:fPIC=True" \
-s os=Linux \
-s arch=x86_64 \
--lockfile-out=.mpt-crypto-lock/conan.lock

- name: Upload Conan lockfile
if: steps.resolve.outputs.needed == 'true'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: conan-lock
if-no-files-found: error
retention-days: 1
path: .mpt-crypto-lock/conan.lock

Comment on lines +45 to +155

@semgrep-companion-app semgrep-companion-app Bot Jul 23, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using variable interpolation ${{...}} with github context data in a run: step could allow an attacker to inject their own code into the runner. This would allow them to steal secrets and code. github context data can have arbitrary user input and should be treated as untrusted. Instead, use an intermediate environment variable with env: to store the data and use the environment variable in the run: script. Be sure to use double-quotes the environment variable, like this: "$ENVVAR".

🎉 Fixed in commit a386a3a 🎉

build:
needs: check
if: needs.check.outputs.needed == 'true'
strategy:
matrix:
include:
- os: ubuntu-22.04
platform: linux-amd64
- os: ubuntu-22.04-arm
platform: linux-arm64
- os: macos-latest
platform: darwin-arm64
- os: macos-15-intel
platform: darwin-amd64

runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false

- name: Download Conan lockfile
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
name: conan-lock
path: .mpt-crypto-lock/

- name: Install Conan
run: |
set -euo pipefail
pip install "conan==2.26.2"
conan profile detect

# Hosted runners can ship compilers newer than Conan's bundled
# settings.yml. Extend, rather than replace, the supported versions
# with the compiler version detected in the ephemeral runner profile.
conan_home=$(conan config home)
profile="$conan_home/profiles/default"
compiler=$(sed -n 's/^compiler=//p' "$profile")
compiler_version=$(sed -n 's/^compiler.version=//p' "$profile")
if [ -z "$compiler" ] || [ -z "$compiler_version" ]; then
echo "::error::Could not read compiler settings from $profile"
exit 1
fi
cat > "$conan_home/settings_user.yml" <<EOF
compiler:
$compiler:
version: ["$compiler_version"]
EOF
conan profile show -pr:h default >/dev/null

conan remote add --index 0 xrplf https://conan.ripplex.io

- name: Build CGO dependency bundle
env:
MPT_CRYPTO_VERSION: ${{ needs.check.outputs.version }}
TARGET_PLATFORM: ${{ matrix.platform }}
run: |
set -euo pipefail
bash confidential/deps/update.sh \
--platform "$TARGET_PLATFORM" \
--force \
--version "$MPT_CRYPTO_VERSION" \
--lockfile "$GITHUB_WORKSPACE/.mpt-crypto-lock/conan.lock"

- name: Verify CGO dependency bundle
env:
TARGET_PLATFORM: ${{ matrix.platform }}
run: |
set -euo pipefail
for archive in libmpt-crypto.a libsecp256k1.a libcrypto.a; do
path="confidential/deps/libs/$TARGET_PLATFORM/$archive"
test -s "$path"
ar -t "$path" >/dev/null
done

header_manifest="$GITHUB_WORKSPACE/confidential/deps/MANIFEST.sha256"
(
cd confidential/deps/include
find . -type f -name '*.h' -print |
LC_ALL=C sort |
while IFS= read -r header; do shasum -a 256 "$header"; done
) > "$header_manifest"
(cd confidential/deps/include && shasum -a 256 -c "$header_manifest")

cc \
-Iconfidential/deps/include \
-Iconfidential/deps/include/utility \
-x c -fsyntax-only - <<'EOF'
#include "mpt_utility.h"
int main(void) { return 0; }
EOF

- name: Upload platform artifact
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: mpt-crypto-${{ matrix.platform }}
if-no-files-found: error
path: |
confidential/deps/VERSION
confidential/deps/MANIFEST.sha256
confidential/deps/include/
confidential/deps/libs/${{ matrix.platform }}/

pr:
needs: [check, build]
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false

- name: Download all platform artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
path: artifacts/

- name: Validate and merge artifacts into repo
env:
EXPECTED_VERSION: ${{ needs.check.outputs.version }}
run: |
set -euo pipefail

merge_dir=$(mktemp -d)
trap 'rm -rf "$merge_dir"' EXIT
mkdir -p "$merge_dir/libs"

header_source=""
manifest_source=""
artifact_count=0
for dir in artifacts/mpt-crypto-*/; do
artifact_count=$((artifact_count + 1))
platform=$(basename "$dir" | sed 's/mpt-crypto-//')
case "$platform" in
linux-amd64|linux-arm64|darwin-amd64|darwin-arm64) ;;
*) echo "::error::Unexpected platform artifact: $platform"; exit 1 ;;
esac

actual_version=$(cat "$dir/VERSION")
if [ "$actual_version" != "$EXPECTED_VERSION" ]; then
echo "::error::$platform artifact has version $actual_version, expected $EXPECTED_VERSION"
exit 1
fi

source_libs="$dir/libs/$platform"
archive_count=$(find "$source_libs" -maxdepth 1 -type f -name '*.a' | wc -l | tr -d ' ')
if [ "$archive_count" -ne 3 ]; then
echo "::error::$platform artifact contains $archive_count archives, expected 3"
exit 1
fi

mkdir -p "$merge_dir/libs/$platform"
for archive in libmpt-crypto.a libsecp256k1.a libcrypto.a; do
if [ ! -s "$source_libs/$archive" ]; then
echo "::error::$platform artifact is missing $archive"
exit 1
fi
cp "$source_libs/$archive" "$merge_dir/libs/$platform/"
done

artifact_manifest="$dir/MANIFEST.sha256"
if [ ! -s "$artifact_manifest" ]; then
echo "::error::$platform artifact is missing its header checksum manifest"
exit 1
fi
artifact_manifest=$(cd "$(dirname "$artifact_manifest")" && pwd)/$(basename "$artifact_manifest")
(cd "$dir/include" && shasum -a 256 -c "$artifact_manifest")

if [ -z "$header_source" ]; then
header_source="$dir/include"
manifest_source="$artifact_manifest"
elif ! cmp -s "$manifest_source" "$artifact_manifest"; then
echo "::error::Public header checksums differ between platform artifacts"
exit 1
elif ! diff -qr "$header_source" "$dir/include"; then
echo "::error::Public headers differ between platform artifacts"
exit 1
fi
done

if [ "$artifact_count" -ne 4 ]; then
echo "::error::Found $artifact_count platform artifacts, expected 4"
exit 1
fi

mkdir -p "$merge_dir/include"
cp -R "$header_source/." "$merge_dir/include/"
for header in mpt_protocol.h secp256k1_mpt.h secp256k1.h utility/mpt_utility.h; do
if [ ! -s "$merge_dir/include/$header" ]; then
echo "::error::Merged artifact is missing public header $header"
exit 1
fi
done

rm -rf confidential/deps/libs confidential/deps/include
cp -R "$merge_dir/libs" confidential/deps/libs
cp -R "$merge_dir/include" confidential/deps/include
printf '%s\n' "$EXPECTED_VERSION" > confidential/deps/VERSION

- name: Create PR
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ needs.check.outputs.version }}
CURRENT_VERSION: ${{ needs.check.outputs.current }}
UPDATE_BRANCH: ${{ needs.check.outputs.branch }}
BASE_BRANCH: ${{ github.ref_name }}
run: |
set -euo pipefail

git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git checkout -b "$UPDATE_BRANCH"
git add -f confidential/deps/
if git diff --cached --quiet; then
echo "The rebuilt dependency bundle is unchanged; no PR is required."
exit 0
fi
git commit -m "chore(confidential): update vendored mpt-crypto to $VERSION"
gh auth setup-git
git push -u origin "$UPDATE_BRANCH"

gh pr create \
--base "$BASE_BRANCH" \
--title "Update vendored mpt-crypto to $VERSION" \
--body "$(cat <<EOF
Automated update of the vendored mpt-crypto CGO dependency bundle.

**$CURRENT_VERSION → $VERSION**

The workflow built and tested the complete static-library and public-header bundle on:
- linux-amd64
- linux-arm64
- darwin-arm64
- darwin-amd64
EOF
)"
Comment on lines +365 to +394

@semgrep-companion-app semgrep-companion-app Bot Jul 23, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using variable interpolation ${{...}} with github context data in a run: step could allow an attacker to inject their own code into the runner. This would allow them to steal secrets and code. github context data can have arbitrary user input and should be treated as untrusted. Instead, use an intermediate environment variable with env: to store the data and use the environment variable in the run: script. Be sure to use double-quotes the environment variable, like this: "$ENVVAR".

🧹 Fixed in commit a386a3a 🧹

Loading