Skip to content

Error when calling createComment with markdown in body #723

Description

@wkwi2r

Describe the bug
The following error is thrown:
Error: Unhandled error: SyntaxError: Unexpected identifier 'pickle'

To Reproduce
Steps to reproduce the behavior:
run the following action step:

    - name: Create comment
      uses: actions/github-script@v9.0.0
      with:
        github-token: ${{ inputs.github-token }}
        script: |
          github.rest.issues.createComment({
            issue_number: context.issue.number,
            owner: context.repo.owner,
            repo: context.repo.repo,
            body: `### 1. **Arbitrary Code Execution via `pickle.loads()` on Untrusted Input** (`test01.py`)
 
              **Severity: CRITICAL**
             
              The file `test01.py` takes user input directly and passes it to `pickle.loads()`. This is a well-known **Remote Code Execution (RCE)** vulnerability. An attacker can craft a malicious pickle payload that executes arbitrary system commands upon deserialization.
             
              Additionally, `pickle.loads()` expects `bytes`, but `input()` returns a `str` in Python 3, so this code will also raise a **`TypeError`** at runtime.
             
              **File: `test01.py`**
             
              ```python
              # Current (vulnerable and broken):
              import pickle
             
              data = input("Enter serialized data: ")
              obj = pickle.loads(data)
              ```
             
              **Suggested fix:**
             
              ```python
              import json
             
              data = input("Enter serialized data: ")
              obj = json.loads(data)
              ```
             
              If `pickle` is absolutely required (not recommended with untrusted input), at minimum fix the type error and restrict allowed classes:
             
              ```python
              import pickle
              import io
             
              ALLOWED_CLASSES = {
                  # explicitly list allowed classes here
              }
             
              class RestrictedUnpickler(pickle.Unpickler):
                  def find_class(self, module, name):
                      if (module, name) in ALLOWED_CLASSES:
                          return ALLOWED_CLASSES[(module, name)]
                      raise pickle.UnpicklingError(f"Forbidden class: {module}.{name}")
             
              data = input("Enter serialized data: ")
              obj = RestrictedUnpickler(io.BytesIO(data.encode('latin-1'))).load()
              ```
            `
          })

Expected behavior
No error and comment is created.

Desktop (please complete the following information):

  • OS: Ubuntu 22.04
  • Runner 2.331.0

Additional context
The markdown text is actually a dynamic response generated by a LLM, hence no way to modify the markdown contents.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions