Repository navigation
Error when calling createComment with markdown in body #723
Copy link
Copy link
Open
Description
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.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
dkfellows commentedon Aug 12, 2026
Pass that string into the script via an environment variable (or a file if it's too big) instead of direct substitution, which is dreadfully likely to hit all sorts of problems.