{"id":"CVE-2026-124622","kind":"vulnerability","aliases":["CVE-2026-124622"],"related":[],"title":"PHP-FTS: symlink race in index storage lets local users tamper with files","description":"A vulnerability was identified in olivier-ls PHP-FTS up to 1.1.3. This impacts the function TrigramIndex::open of the file Storage.php. Such manipulation leads to time-of-check time-of-use. The attack needs to be performed locally. Upgrading to version 1.1.4 will fix this issue. The name of the patch is 0b2fae333d6b022da7ed4c43e2d41aa03f91dff3. Upgrading the affected component is recommended. The project maintainer explains: \"[T]he attack requires write access to the index directory by a user other than the one running the application. That is a real shared-hosting scenario and worth defending against, which is why it is fixed but it is a hardening measure rather than a remotely reachable vulnerability, and the \"Code Execution\" impact additionally assumes the symlink target is a web-served .php file.\"","summary":"PHP-FTS up to 1.1.3 has a time-of-check time-of-use race in TrigramIndex::open in Storage.php. A local user with write access to the index directory can exploit it to redirect file access, which the maintainer says can lead to code execution only if the symlink target is a web-served .php file.","severity":"medium","cvss":5.3,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["package","php","php-fts","shared-hosting"],"not_affected_if":["private-index-directory","single-user-host","version-1.1.4-or-later"],"how_to_check":"- Check the installed php-fts version in your project's lock file or `composer show` output, and see whether it is `1.1.3` or earlier.\n- Look at whether the index directory is writable by users other than the one running the application.","fix":"- php-fts: upgrade to `1.1.4` (patch commit 0b2fae333d6b022da7ed4c43e2d41aa03f91dff3)","status":"open","published_at":"2026-11-09T13:17:07+00:00","first_seen_at":"2026-11-09T13:26:51+00:00","triaged_at":"2026-11-09T13:27:46+00:00","updated_at":"2026-11-09T13:27:46+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-11-09T13:27:46Z","model":"claude-haiku-5-5","output":{"fix":"- php-fts: upgrade to `1.1.4` (patch commit 0b2fae333d6b022da7ed4c43e2d41aa03f91dff3)","reach":"local","title":"PHP-FTS: symlink race in index storage lets local users tamper with files","impact":"medium","summary":"PHP-FTS up to 1.1.3 has a time-of-check time-of-use race in TrigramIndex::open in Storage.php. A local user with write access to the index directory can exploit it to redirect file access, which the maintainer says can lead to code execution only if the symlink target is a web-served .php file.","audience":"developers","category":"package","nicknames":[],"who_cares":["php","php-fts","shared-hosting"],"confidence":0.7,"fix_status":"available","needs_auth":"yes","worst_case":"local user redirects index file access to a web-served PHP file","analyst_note":"","how_to_check":"- Check the installed php-fts version in your project's lock file or `composer show` output, and see whether it is `1.1.3` or earlier.\n- Look at whether the index directory is writable by users other than the one running the application.","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["single-user-host","private-index-directory","version-1.1.4-or-later"],"who_is_affected":"Applications that use PHP-FTS up to 1.1.3 and store the search index in a directory that other local users can write to, such as shared hosting. The maintainer describes it as a hardening fix rather than a remotely reachable flaw, so a single-user server with a private index directory is much less exposed.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000764,"input_tokens":4752,"output_tokens":577,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-124622':17A,20A '-2026':16A,19A '0b2fae333d6b022da7ed4c43e2d41aa03f91dff3':146C '1.1.3':34B,102C '1.1.4':135C 'access':56B,67B,162C 'addit':212C 'affect':149C 'applic':176C 'assum':213C 'attack':126C,159C 'check':40B,120C 'code':75B,209C 'compon':150C 'cve':15A,18A 'defend':187C 'directori':60B,166C 'execut':76B,210C 'explain':156C 'exploit':62B 'file':14A,66B,88B,111C,223C 'fix':137C,194C 'fts':3A,25B,31B,99C 'function':106C 'harden':199C 'host':28B,183C 'identifi':92C 'impact':104C,211C 'index':7A,59B,165C 'issu':139C 'lead':73B,115C 'let':9A 'local':10A,52B,131C 'ls':96C 'maintain':70B,155C 'manipul':114C 'measur':200C 'name':141C 'need':127C 'olivi':95C 'olivier-l':94C 'one':173C 'open':48B,108C 'packag':21B 'patch':144C 'perform':130C 'php':2A,22B,24B,30B,87B,98C,222C 'php-fts':1A,23B,29B,97C 'project':154C 'race':5A,45B 'rather':201C 'reachabl':205C 'real':180C 'recommend':152C 'redirect':65B 'remot':204C 'requir':160C 'run':174C 'say':71B 'scenario':184C 'serv':86B,221C 'share':27B,182C 'shared-host':26B,181C 'storag':8A 'storage.php':50B,112C 'symlink':4A,80B,215C 'tamper':12A 'target':81B,216C 'time':38B,42B,118C,122C 'time-of-check':37B,117C 'time-of-us':41B,121C 'trigramindex':47B,107C 'upgrad':132C,147C 'use':44B,124C 'user':11A,53B,169C 'version':134C 'vulner':90C,206C 'web':85B,220C 'web-serv':84B,219C 'worth':186C 'write':55B,161C","nicknames":[],"mitigations":[],"who_affected":"Applications that use PHP-FTS up to 1.1.3 and store the search index in a directory that other local users can write to, such as shared hosting. The maintainer describes it as a hardening fix rather than a remotely reachable flaw, so a single-user server with a private index directory is much less exposed.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["medium","package","php","phpfts","sharedhosting"],"campaign_type":null,"search_a":"'-124622':17A,20A '-2026':16A,19A 'cve':15A,18A 'file':14A 'fts':3A 'index':7A 'let':9A 'local':10A 'php':2A 'php-fts':1A 'race':5A 'storag':8A 'symlink':4A 'tamper':12A 'user':11A","search_b":"'1.1.3':34B 'access':56B,67B 'check':40B 'code':75B 'directori':60B 'execut':76B 'exploit':62B 'file':66B,88B 'fts':25B,31B 'host':28B 'index':59B 'lead':73B 'local':52B 'maintain':70B 'open':48B 'packag':21B 'php':22B,24B,30B,87B 'php-fts':23B,29B 'race':45B 'redirect':65B 'say':71B 'serv':86B 'share':27B 'shared-host':26B 'storage.php':50B 'symlink':80B 'target':81B 'time':38B,42B 'time-of-check':37B 'time-of-us':41B 'trigramindex':47B 'use':44B 'user':53B 'web':85B 'web-serv':84B 'write':55B","search_c":"'0b2fae333d6b022da7ed4c43e2d41aa03f91dff3':146C '1.1.3':102C '1.1.4':135C 'access':162C 'addit':212C 'affect':149C 'applic':176C 'assum':213C 'attack':126C,159C 'check':120C 'code':209C 'compon':150C 'defend':187C 'directori':166C 'execut':210C 'explain':156C 'file':111C,223C 'fix':137C,194C 'fts':99C 'function':106C 'harden':199C 'host':183C 'identifi':92C 'impact':104C,211C 'index':165C 'issu':139C 'lead':115C 'local':131C 'ls':96C 'maintain':155C 'manipul':114C 'measur':200C 'name':141C 'need':127C 'olivi':95C 'olivier-l':94C 'one':173C 'open':108C 'patch':144C 'perform':130C 'php':98C,222C 'php-fts':97C 'project':154C 'rather':201C 'reachabl':205C 'real':180C 'recommend':152C 'remot':204C 'requir':160C 'run':174C 'scenario':184C 'serv':221C 'share':182C 'shared-host':181C 'storage.php':112C 'symlink':215C 'target':216C 'time':118C,122C 'time-of-check':117C 'time-of-us':121C 'trigramindex':107C 'upgrad':132C,147C 'use':124C 'user':169C 'version':134C 'vulner':90C,206C 'web':220C 'web-serv':219C 'worth':186C 'write':161C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-09T13:17:07+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"cna@vuldb.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-124622","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-124622","severity":null,"published_at":"2026-11-09T13:17:07+00:00","modified_at":"2026-11-09T13:17:07+00:00","first_seen_at":"2026-11-09T13:26:51+00:00","fetched_at":"2026-11-09T13:26:51+00:00","note":null}],"documents":[{"id":107558,"url":"https://github.com/olivier-ls/php-fts/commit/0b2fae333d6b022da7ed4c43e2d41aa03f91dff3","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":107559,"url":"https://github.com/olivier-ls/php-fts/releases/tag/v1.1.4","title":"Release notes: github.com","kind":"release","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release notes: github.com"}],"disclosures":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}