mirror of
https://github.com/usestrix/strix.git
synced 2026-08-22 02:58:39 +02:00
fix(llm): open the store lock file with O_NOFOLLOW
The predictable lock path was opened with Path.open("w"), following (and
truncating through) a pre-positioned symlink. Open it via os.open with
O_NOFOLLOW and no O_TRUNC, raising StoreLockError on a symlinked lock path.
This commit is contained in:
@@ -88,3 +88,20 @@ def test_mutation_aborts_when_lock_cannot_be_acquired(
|
||||
with pytest.raises(subscription_store.StoreLockError):
|
||||
grok.save_record({"type": "oauth", "access": "g", "refresh": "r"})
|
||||
assert not store.exists()
|
||||
|
||||
|
||||
def test_lock_file_rejects_a_pre_positioned_symlink(
|
||||
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
store_dir = tmp_path / ".strix"
|
||||
store_dir.mkdir()
|
||||
store = store_dir / "subscription-auth.json"
|
||||
monkeypatch.setattr(grok, "AUTH_PATH", store)
|
||||
# Attacker pre-plants a symlink where the lock file would be created.
|
||||
outside = tmp_path / "attacker-target"
|
||||
store.with_suffix(".lock").symlink_to(outside)
|
||||
|
||||
with pytest.raises(subscription_store.StoreLockError):
|
||||
grok.save_record({"type": "oauth", "access": "g", "refresh": "r"})
|
||||
# The symlink target was never created/truncated through the lock open.
|
||||
assert not outside.exists()
|
||||
|
||||
Reference in New Issue
Block a user