diff --git a/.github/workflows/kernelctf-vuln-verify.yaml b/.github/workflows/kernelctf-vuln-verify.yaml index 1de45adb..af2e8b3e 100644 --- a/.github/workflows/kernelctf-vuln-verify.yaml +++ b/.github/workflows/kernelctf-vuln-verify.yaml @@ -31,24 +31,13 @@ jobs: with: credentials_json: '${{ secrets.KERNELCTF_GCS_SA_KEY }}' - - name: Checkout PR - uses: actions/checkout@v4 - with: - ref: ${{ env.PR_REF }} - path: pr - sparse-checkout: pocs/linux/kernelctf/** - sparse-checkout-cone-mode: false - - - name: List PR contents - run: find pr - - name: Determine submission folder id: determine_folder run: | FILES=$(gh pr view $PR_NUM --json files --jq '.files[] | .path') echo "Files in PR:" echo "$FILES" - + POC_FOLDER=$(echo "$FILES" | grep '^pocs/linux/kernelctf/' | cut -d/ -f1-4 | sort -u) if [ $(echo "$POC_FOLDER" | grep -c .) -ne 1 ]; then echo "Exactly one PoC folder must be found in pocs/linux/kernelctf/, but found:" @@ -64,6 +53,18 @@ jobs: echo "folder=$POC_FOLDER" >> $GITHUB_OUTPUT echo "Found PoC folder: $POC_FOLDER" + - name: Checkout PR + uses: actions/checkout@v4 + with: + ref: ${{ env.PR_REF }} + path: pr + sparse-checkout: "${{ steps.determine_folder.outputs.folder }}" + sparse-checkout-cone-mode: true + fetch-depth: 1 + + - name: List PR contents + run: find pr + - name: Checkout kernel-research uses: actions/checkout@v4 with: diff --git a/kernelctf/vuln-verify/utils.py b/kernelctf/vuln-verify/utils.py index ddf280c0..18679570 100644 --- a/kernelctf/vuln-verify/utils.py +++ b/kernelctf/vuln-verify/utils.py @@ -12,13 +12,15 @@ CACHE_DIR = "./" CACHE_TIME = 0 if "--disable-cache" in sys.argv else 3600*24 CACHE_FOREVER = float("inf") -def run(cmd, cwd=None): +def run(cmd, cwd=None, fail_silent=False): shell = not isinstance(cmd, list) try: - result = subprocess.check_output(cmd, cwd=cwd, shell=shell).decode('utf-8').split('\n') + stderr = subprocess.DEVNULL if fail_silent else None + result = subprocess.check_output(cmd, cwd=cwd, shell=shell, stderr=stderr).decode('utf-8').split('\n') return result if result[-1] != "" else result[0:-1] except subprocess.CalledProcessError as e: - print(f"[!] executing '{cmd}' failed with exit code {e.returncode}") + if not fail_silent: + print(f"[!] executing '{cmd}' failed with exit code {e.returncode}") return None def readTextFile(fn): diff --git a/kernelctf/vuln-verify/verify.py b/kernelctf/vuln-verify/verify.py index 6607bfcd..89449a9e 100755 --- a/kernelctf/vuln-verify/verify.py +++ b/kernelctf/vuln-verify/verify.py @@ -56,15 +56,13 @@ def gcs_download(local_fn, gcs_fn): if not args.gcs_cache or os.path.isfile(local_fn): return os.path.isfile(local_fn) print(f" [CACHE] downloading {os.path.basename(local_fn)} from GCS...") - return run(["gcloud", "storage", "cp", f"{GCS_BASE_URL}/{gcs_fn}", local_fn]) is not None + return run(["gcloud", "storage", "cp", f"{GCS_BASE_URL}/{gcs_fn}", local_fn], fail_silent=True) is not None def gcs_upload(local_fn, gcs_fn, gzip=False): if not args.gcs_cache or not os.path.isfile(local_fn): return print(f" [CACHE] uploading {os.path.basename(local_fn)} to GCS...") - cmd = ["gcloud", "storage", "cp", local_fn, f"{GCS_BASE_URL}/{gcs_fn}"] - if gzip: - cmd.append("--gzip-encoded") + cmd = ["gcloud", "storage", "cp"] + (["-Z"] if gzip else []) + [local_fn, f"{GCS_BASE_URL}/{gcs_fn}"] run(cmd) args.exploit_paths = [os.path.abspath(p) for p in args.exploit_paths]