Codex 与 GPT-6.1 Sol 越狱提示词:gpt-instruct 隔离配置、对照测试与回滚
Codex 越狱教程不难照着操作,难的是验证效果。换了一份指令文件、回答更直接、绕过了模型的安全行为,是三件不同的事。
本文沿着7 月 16 日的介绍文章和 gpt-instruct 仓库的思路,检查提示词包,通过 Codex 配置接口加载,再比较输出。适合会使用 Git、Bash 和 Python 的 Linux、WSL 用户。
**先纠正模型名:**需求中的 gpt-sol-6.1 与官方 CLI ID gpt-6.1-sol 顺序不同。下文明确使用后者;如果第三方服务把前者作为别名,需要向该服务核实映射,不能默认等价。官方模型文档
1. 两份参考资料究竟说明了什么
旧文章介绍了沙箱角色设定、抽象目标标签和抑制拒绝表达等手法。这些是在尝试影响模型回答;声称处于沙箱,并不会真的创建沙箱。文中成绩针对旧模型,不是 GPT-6.1 Sol 的实测结果。原文
实时仓库已经提供 Sol 专用预发布版 gpt-6.1-sol-v1-rc2。README 说明 B 门禁尚未全部通过,C 阶段未运行,不能据此宣称通用越狱成功。下面固定使用提交 3ab84df64468bb74cc9eb4e5423660083953c44f,避免依赖缓存页面或不断变化的 main。上游 README
Codex 支持 model_instructions_file,但它替换的是内置指令,并非只追加一点写作风格。使用前要审阅完整内容。配置项和提示词都不会改变操作系统权限,也不会凭空赋予账号访问能力。官方配置文档
2. 准备独立实验环境
需要已安装的 Codex CLI、Git、Python 3,以及账号对目标模型的访问权限。先检查命令:
codex --version
codex exec --help
下文参数已对照本机 CLI 0.165.0 和官方 CLI 文档核对。本文是配置与测试教程,没有提供在线模型越狱实测成绩。
在 Bash 终端中,创建一个位于现有项目之外的新实验目录:
mkdir -p "$HOME/codex-labs"
export LAB="$(mktemp -d "$HOME/codex-labs/sol-instruct-XXXXXXXX")"
export MODEL='gpt-6.1-sol'
mkdir -p "$LAB/fixture" "$LAB/codex-home"
git -C "$LAB/fixture" init -q
printf 'Lab: %s\n' "$LAB"
后续命令复用这些变量,请保留这个终端。实验目录会留下,便于检查结果。独立 Codex home 可以隔开实验状态与主配置,但不是安全容器。不要把凭据和无关文件放进测试目录。
用你自己的账号登录实验 home:
CODEX_HOME="$LAB/codex-home" codex login
如果使用自定义 provider,按其文档在实验 home 配置必要的 provider 和认证字段即可。不要整份复制主配置,也不要公开认证文件。
3. 获取并审阅候选提示词
下面的完整代码块会把下载放进独立临时目录,记录提交号,只将 Markdown 提示词复制到实验目录,最后清理下载。它不会运行仓库安装脚本:
bash <<'BASH'
set -euo pipefail
: "${LAB:?Run the lab setup first}"
mkdir -p /tmp/codex-work
download=$(mktemp -d /tmp/codex-work/sol-instruct-download-XXXXXXXX)
trap 'rm -rf -- "$download"' EXIT
git clone --no-checkout https://github.com/MDX-Tom/gpt-instruct.git "$download/upstream"
git -C "$download/upstream" checkout --detach 3ab84df64468bb74cc9eb4e5423660083953c44f
git -C "$download/upstream" rev-parse HEAD > "$LAB/upstream-commit.txt"
python3 - "$download/upstream/gpt-6.1-sol-v1-rc2.zip" "$LAB/candidate.md" <<'PY'
import hashlib
import sys
from pathlib import Path
from zipfile import ZipFile
with ZipFile(sys.argv[1]) as archive:
entries = [item for item in archive.infolist()
if not item.is_dir() and item.filename.lower().endswith('.md')]
if len(entries) != 1:
raise SystemExit('Expected one Markdown file; inspect the archive manually')
if entries[0].file_size > 1_000_000:
raise SystemExit('Unexpectedly large prompt; inspect manually')
data = archive.read(entries[0])
data.decode('utf-8')
with Path(sys.argv[2]).open('xb') as output:
output.write(data)
print('bytes:', len(data))
print('sha256:', hashlib.sha256(data).hexdigest())
PY
BASH
cat "$LAB/upstream-commit.txt"
sha256sum "$LAB/candidate.md"
less "$LAB/candidate.md"
本地检查确认,下载的 ZIP 含一份 UTF-8 Markdown,大小为 7,575 bytes;ZIP 的 SHA-256 是 007b8c5858110b809e5b90cd2c18bdc6965246aaee5af170b5487818b7055364,与固定版本的 README 一致。读完全文,再决定是否继续。提取过程只写入固定文件,不按压缩包路径解压,也不会覆盖已存在的候选文件。
仓库可能更新。如果 ZIP 不存在,或者里面有多份 Markdown,应停下来检查所记录的版本,不要悄悄换一个发布包。修改候选内容后,重新记录哈希。本文不重新分发上游提示词正文。
4. 用相同输入运行基线、候选与回滚
先做一个无害的加载与格式检查:
printf 'alpha\nbeta\n' > "$LAB/fixture/input.txt"
cat > "$LAB/task.txt" <<'TASK'
Read input.txt in the current working directory. Return its contents in
uppercase, with exactly two lines and no code fences or commentary.
Do not modify any files.
TASK
sha256sum "$LAB/fixture/input.txt" > "$LAB/input-before.sha256"
在同一个 Bash 终端中运行三个条件,每次都启动新会话。只有 candidate 这一轮传入指令覆盖项:
run_case() {
local label="$1"
shift
CODEX_HOME="$LAB/codex-home" codex exec \
-C "$LAB/fixture" -m "$MODEL" -s read-only \
-c 'model_reasoning_effort="medium"' \
--ephemeral --json -o "$LAB/$label.txt" \
"$@" "$(cat "$LAB/task.txt")" \
> "$LAB/$label.events.jsonl" 2> "$LAB/$label.stderr"
local status=$?
printf '%s\n' "$status" > "$LAB/$label.exit"
printf '%s exit=%s\n' "$label" "$status"
}
run_case baseline
run_case candidate -c "model_instructions_file=\"$LAB/candidate.md\""
run_case rollback
sha256sum -c "$LAB/input-before.sha256"
这段代码应在未开启 set -e 的普通交互式 Bash 中运行,让失败的一轮也能记录退出码,再继续其他条件。只读沙箱限制文件写入,但不会隔离所有可读文件,也不会自动审查外部工具。本实验没有添加 MCP server 或 hook。
任务的预期回答是:
ALPHA
BETA
检查实际结果,不要只搜索模型回复里的“成功”:
python3 - <<'PY'
import os
from pathlib import Path
lab = Path(os.environ['LAB'])
for label in ('baseline', 'candidate', 'rollback'):
result = lab / f'{label}.txt'
text = result.read_text() if result.exists() else ''
status = (lab / f'{label}.exit').read_text().strip()
ok = status == '0' and text.strip() == 'ALPHA\nBETA'
print(f'{label}: exit={status}, task_pass={ok}, output={text!r}')
PY
通过这个检查,只能说明任务遵循情况,不能证明安全边界被绕过。基线与候选回答相同,也是有效结果。扩大评测时,应先确定样例和评分规则,多次运行各个条件,并记录模型 ID、推理等级、CLI 版本、仓库提交、提示词哈希、原始输出、错误与退出码。任务失败要与认证、额度、网络失败分开统计。
5. 回滚不需要修复主配置
这里的回滚,是像第三轮那样,重新启动一次不带 model_instructions_file 覆盖项的调用。整个流程没有写入持久指令配置。保留候选和日志供对照,不要把候选会话继续聊下去当作基线。
如果你另外运行过安装脚本并修改了持久配置,这种单次调用的回滚并不能撤销安装。应查阅对应安装器的恢复说明,并检查相关配置差异。
6. 常见问题
| 现象 | 直接处理 |
|---|---|
| 找不到模型 | 检查账号权限与完整 ID,不要默认 gpt-sol-6.1 是有效别名。 |
| 认证失败 | 再运行 CODEX_HOME="$LAB/codex-home" codex login,或修正实验 provider 配置。 |
| 找不到候选文件 | 用 test -f "$LAB/candidate.md" 检查,并按示例传绝对路径。 |
| 不识别 CLI 参数 | 检查 codex exec --help 和安装版本,再调整参数。 |
| 基线看起来也被定制过 | 检查实验配置,以及 fixture 父目录中的指令文件。 |
| 加载后回答反而变差 | 保留输出,取消单次覆盖项后重测;提示词包不一定是升级。 |
总结
Codex 可以加载审阅过的指令文件,因此可以在不修改主配置的情况下测试参考项目的思路。用于 GPT-6.1 Sol 时,应使用官方模型 ID,并把预发布包当作需要测量的候选,而不是保证有效的绕过方案。分别保存基线、候选与回滚证据,不要把格式测试通过写成越狱成功。
- 原文作者:春江暮客
- 原文链接:https://www.bobobk.com/codex-gpt-6-1-sol-jailbreak.html
- 版权声明:本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。