CVE-2026-112940:
Python 취약성 분석 및 완화
개요
CVE-2026-112940 is a TOCTOU race condition and symlink-following vulnerability in the filelock Python library's ReadWriteLock (SQLite-backed) implementation. Affecting versions 3.20.4 through 4.2.0, the flaw allows a local attacker with rename access in a non-sticky parent directory to redirect SQLite file operations — causing arbitrary file overwrites, unlinks, or denial of service — against the lock user's own files. The vulnerability was reported by Anthropic's OSS Scanner on October 15, 2026, and publicly disclosed on October 17–20, 2026. It carries a CVSS v3.1 base score of 7.1 (High) (GitHub Advisory, Red Hat CVE).
기술적 세부 사항
The root cause is classified as CWE-363 (Race Condition Enabling Link Following) and CWE-367 (TOCTOU Race Condition). ReadWriteLock opens its SQLite database via a file descriptor and then passes /proc/self/fd/<n> to sqlite3.connect(). SQLite does not reopen the validated inode — instead it calls readlink() on the /proc path, resolves it to a plain filesystem path (which reads as <path> (deleted) after an unlink), and opens that string by name, following symlinks. A local attacker who can create or rename entries in the non-sticky, world-writable or group-writable directory holding the lock database can: (1) plant a symlink at the (deleted) path to redirect SQLite to an arbitrary target file; (2) place a crafted hot rollback journal (-journal) beside a swapped-in database to replay attacker-controlled content into the victim's files; or (3) plant a -wal file to cause denial of service or corrupt locking semantics. The side-file variants (journal, WAL, SHM) require no race condition and succeed deterministically; the redirect variant succeeded in 77 of 77 inotify-triggered attempts in testing (GitHub Advisory, Fix PR #834).
영향
A low-privileged local attacker can overwrite the first page (4096 bytes) of any regular file the lock user can write with attacker-chosen content, unlink arbitrary files the lock user can delete (via crafted super-journal entries), or cause every read_lock()/write_lock() call to raise sqlite3.OperationalError: disk I/O error (denial of service). Additionally, the attacker can corrupt locking semantics by admitting a reader alongside an exclusive writer, or kill the lock holder with a SIGBUS signal by truncating a memory-mapped -shm file. There is no confidentiality impact, but integrity and availability are both rated High. The attack is limited to the lock user's own privilege level and does not escalate beyond it (GitHub Advisory).
악용 가능성
No public proof-of-concept exploit code has been released, and there is no evidence of in-the-wild exploitation at this time. However, Anthropic's OSS Scanner provided a working reproducer that demonstrated reliable exploitation (77/77 redirect attempts, 20/20 WAL re-plant attempts, and deterministic journal-unlink variants requiring no race). The EPSS score is 0.0, and the vulnerability is not listed in the CISA KEV catalog. Exploitation requires a local account on the same host and write/rename access to a non-sticky shared directory containing the lock database (GitHub Advisory, Red Hat CVE).
착취 단계
- Reconnaissance: Identify a target system running
filelock3.20.4–4.2.0 with aReadWriteLockdatabase stored in a world-writable or group-writable directory lacking the sticky bit (e.g., a shared cache or build directory with mode0777). - Prepare the redirect: As the attacker, create the lock database file (e.g.,
cache.lock.db, mode0666) and a hard linkcache.lock.db.keeppointing to the same inode. Create a symlink namedcache.lock.db (deleted)pointing to the victim's target file (e.g.,/tmp/victim-notes.txt). - Plant the hot journal: Write a crafted SQLite rollback journal at
<target>-journal(e.g.,/tmp/victim-notes.txt-journal) containing a valid journal header and a page record with attacker-chosen content and correct checksum. Set permissions to0666so the victim's SQLite can open it. - Monitor with inotify: Use
inotify_add_watchoncache.lock.dbforIN_OPENevents to detect when the victim'sReadWriteLockopens the database. - Execute the swap: Upon receiving the
IN_OPENevent (victim has opened the file descriptor but not yet calledsqlite3.connect()), unlinkcache.lock.dband re-linkcache.lock.db.keepback to the same name. The victim's/proc/self/fd/<n>now resolves tocache.lock.db (deleted), which follows the planted symlink. - Trigger journal replay: The victim's process calls
sqlite3.connect('/proc/self/fd/<n>'), SQLite follows the symlink to the target file, finds the hot journal, and replays the attacker's page content into the victim's file — overwriting it with attacker-controlled data at offset 0. - Verify: The victim's file (e.g.,
0600, owned by victim) now contains the attacker's content despite the attacker having no direct write permission to it. The victim's lock call raisessqlite3.OperationalError: disk I/O error(GitHub Advisory).
타협의 징후
- File System: Unexpected
-journal,-wal, or-shmfiles appearing beside aReadWriteLockdatabase in a shared directory; symlinks named<lockdb> (deleted)in the lock database directory; files owned by a different user than the lock database owner in the same directory; lock database files with mode0666(attacker-created) rather than0600(filelock default). - Logs: Repeated
sqlite3.OperationalError: disk I/O errorexceptions in application logs fromread_lock()orwrite_lock()calls; unexpectedSIGBUScrashes in processes usingReadWriteLock; Python tracebacks referencing_do_acquire_inneror_open_lock_databasewith I/O errors. - Process: Unexpected
inotify_add_watchsyscalls on lock database files by a process belonging to a different user;readlinkcalls on/proc/<pid>/fd/<n>returning paths ending in(deleted);openatcalls on symlink targets not matching the expected lock database path (visible instraceoutput). - Network: No network indicators — this is a local privilege abuse vulnerability with no network component.
완화 및 해결 방법
Upgrade filelock to version 4.2.1, which fixes the vulnerability by connecting SQLite only through names no other process can change: in owner-only directories, SQLite uses the database path directly; in shared directories, it uses a hard link inside a randomly named private .filelock-* subdirectory inaccessible to other accounts (filelock 4.2.1 Release, Fix PR #834).
If immediate upgrade is not possible, apply these workarounds:
- Store the
ReadWriteLockdatabase in a directory owned exclusively by the locking account (or root) with no group or other write bits (e.g., mode0700). - Ensure all ancestor directories of the lock database belong to the locking account or root and are either not world/group-writable or have the sticky bit set (
mode 1777). - On Linux, ensure
fs.protected_regularis set to1or2andfs.protected_hardlinks=1(distribution defaults on most systems) to limit exploitation in sticky directories. - Treat any sudden
sqlite3.OperationalError: disk I/O erroron every lock acquire as a potential indicator of a planted-walfile requiring manual removal by the file owner or root.
커뮤니티 반응
The vulnerability was reported privately by Anthropic's OSS Scanner (automated analysis) on October 15, 2026, and the maintainer (gaborbernat) opened a fix PR within hours and published the advisory on October 17, 2026. The advisory notes the finding was classified as "conditional security" — a cross-user effect requiring a specific directory configuration — and the maintainer accepted the mechanism while narrowing the scope to the non-sticky shared directory precondition. Red Hat tracked the issue via Bugzilla (bug #2556219) and published a CVE advisory. No broader media coverage or notable community controversy has been identified at this time (GitHub Advisory, Red Hat CVE).
추가 자료
리눅스 배포판 수정 현황
주요 리눅스 배포판과 그 릴리스 전반에 걸친 가용성을 수정하세요.
bookworm
python-filelock
sid
python-filelock
trixie
python-filelock
bionic (esm-apps)
python-filelock
devel
python-filelock
focal (esm-apps)
python-filelock
jammy
python-filelock
jammy (esm-apps)
python-filelock
noble
python-filelock
noble (esm-apps)
python-filelock
resolute
python-filelock
근원: 이 보고서는 AI를 사용하여 생성되었습니다.
관련 Python 취약점:
무료 취약성 평가
클라우드 보안 태세를 벤치마킹합니다
9개의 보안 도메인에서 클라우드 보안 관행을 평가하여 위험 수준을 벤치마킹하고 방어의 허점을 식별합니다.
추가 Wiz 리소스
맞춤형 데모 받기
맞춤형 데모 신청하기
"내가 본 최고의 사용자 경험은 클라우드 워크로드에 대한 완전한 가시성을 제공합니다."
"Wiz는 클라우드 환경에서 무슨 일이 일어나고 있는지 볼 수 있는 단일 창을 제공합니다."
"우리는 Wiz가 무언가를 중요한 것으로 식별하면 실제로 중요하다는 것을 알고 있습니다."