{"id":"CVE-2026-103028","kind":"vulnerability","aliases":["CVE-2026-103028","GHSA-wwv9-g5x4-966q","GO-2026-6802"],"related":[],"title":"SFTPGo source-side file-pattern filter bypass during copy operations in github.com/drakkan/sftpgo","description":"SFTPGo is an open source, event-driven file transfer solution. From 2.5.0 until 2.7.6, an authenticated user with copy permission can copy a source file denied by denied_patterns or outside allowed_patterns to an allowed destination name because file-pattern filters are evaluated only on the destination. The user can then read the denied file contents. Recursive directory copies can reproduce restricted contents under an allowed path, and the hide policy is bypassed because files that appear missing to stat and directory listings can still be copied. Home-directory boundaries, virtual-folder layout, per-directory permissions, access to other accounts, and administrative authorization remain enforced. This issue is fixed in 2.7.6.","summary":"SFTPGo, a Go file transfer server, versions 2.5.0 through 2.7.6 check file-pattern filters only on a copy's destination, not its source. An authenticated user with copy permission can copy a denied or hidden file to an allowed name and read its contents.","severity":"medium","cvss":4.3,"epss":0.00219,"exploited":false,"exploited_at":null,"products":[{"name":"github.com/drakkan/sftpgo","fixed":[],"affected":"all versions","ecosystem":"go"},{"name":"github.com/drakkan/sftpgo/v2","fixed":["2.7.6"],"affected":">= 2.5.0, < 2.7.6","ecosystem":"go"}],"ecosystems":["go"],"tags":["file-transfer","go","package","self-hosted","sftp"],"not_affected_if":["no-copy-permission-users","no-denied-or-hide-patterns","version-outside-2.5.0-to-2.7.5"],"how_to_check":"Run the sftpgo binary with 'sftpgo -v' or check the go.mod of projects importing github.com/drakkan/sftpgo/v2 for a version between 2.5.0 and 2.7.6.","fix":"Upgrade github.com/drakkan/sftpgo/v2 to 2.7.6 or later.","status":"open","published_at":"2026-10-13T15:17:30+00:00","first_seen_at":"2026-10-23T19:13:08+00:00","triaged_at":"2026-10-23T20:03:24+00:00","updated_at":"2026-10-23T20:03:24+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-10-23T20:03:24Z","model":"claude-haiku-5-5","output":{"fix":"Upgrade github.com/drakkan/sftpgo/v2 to 2.7.6 or later.\nunknown","summary":"SFTPGo, a Go file transfer server, versions 2.5.0 through 2.7.6 check file-pattern filters only on a copy's destination, not its source. An authenticated user with copy permission can copy a denied or hidden file to an allowed name and read its contents.","category":"package","who_cares":["go","sftp","self-hosted","file-transfer"],"confidence":0.8,"analyst_note":"","how_to_check":"Run the sftpgo binary with 'sftpgo -v' or check the go.mod of projects importing github.com/drakkan/sftpgo/v2 for a version between 2.5.0 and 2.7.6.\nunknown","needs_analyst":false,"not_affected_if":["version-outside-2.5.0-to-2.7.5","no-copy-permission-users","no-denied-or-hide-patterns"],"severity_if_unknown":"medium"},"cost_usd":0.000406,"input_tokens":2321,"output_tokens":348,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-103028':19A,30A '-2026':18A,26A,29A '-6802':27A '/drakkan/sftpgo':16A,33A '/drakkan/sftpgo/v2':36A '2.5.0':53B,103C '2.7.6':55B,105C,207C '966q':24A 'access':193C 'account':196C 'administr':198C 'allow':85B,123C,127C,159C 'appear':170C 'authent':71B,107C 'author':199C 'boundari':184C 'bypass':9A,166C 'check':56B 'content':90B,149C,156C 'copi':11A,64B,74B,77B,110C,113C,152C,180C 'cve':17A,28A 'deni':79B,117C,119C,147C 'destin':66B,128C,140C 'directori':151C,175C,183C,191C 'driven':98C 'enforc':201C 'evalu':136C 'event':97C 'event-driven':96C 'file':6A,38B,49B,58B,82B,99C,116C,132C,148C,168C 'file-pattern':5A,57B,131C 'file-transf':37B 'filter':8A,60B,134C 'fix':205C 'folder':187C 'g5x4':23A 'ghsa':21A 'ghsa-wwv9-g5x4-966q':20A 'github.com':15A,32A,35A 'github.com/drakkan/sftpgo':14A,31A 'github.com/drakkan/sftpgo/v2':34A 'go':25A,40B,48B 'hidden':81B 'hide':163C 'home':182C 'home-directori':181C 'host':44B 'issu':203C 'layout':188C 'list':176C 'miss':171C 'name':86B,129C 'open':94C 'oper':12A 'outsid':122C 'packag':41B 'path':160C 'pattern':7A,59B,120C,124C,133C 'per':190C 'per-directori':189C 'permiss':75B,111C,192C 'polici':164C 'read':88B,145C 'recurs':150C 'remain':200C 'reproduc':154C 'restrict':155C 'self':43B 'self-host':42B 'server':51B 'sftp':45B 'sftpgo':1A,46B,91C 'side':4A 'solut':101C 'sourc':3A,69B,95C,115C 'source-sid':2A 'stat':173C 'still':178C 'transfer':39B,50B,100C 'user':72B,108C,142C 'version':52B 'virtual':186C 'virtual-fold':185C 'wwv9':22A","nicknames":[],"mitigations":[],"who_affected":null,"tier":null,"verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-13T15:17:30+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"govuln","external_id":"GO-2026-6802","url":"https://pkg.go.dev/vuln/GO-2026-6802","severity":null,"published_at":"2026-10-19T21:08:35+00:00","modified_at":"2026-10-19T21:08:35+00:00","first_seen_at":"2026-10-23T19:13:08+00:00","fetched_at":"2026-10-23T19:13:08+00:00","note":null},{"source":"epss","external_id":"CVE-2026-103028","url":"https://api.first.org/data/v1/epss?cve=CVE-2026-103028","severity":null,"published_at":null,"modified_at":null,"first_seen_at":"2026-10-23T19:13:43+00:00","fetched_at":"2026-10-23T19:13:43+00:00","note":null},{"source":"nvd","external_id":"CVE-2026-103028","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-103028","severity":null,"published_at":"2026-10-13T15:17:30+00:00","modified_at":"2026-10-14T15:17:03+00:00","first_seen_at":"2026-10-23T19:35:23+00:00","fetched_at":"2026-10-23T19:35:23+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}