CVE-2026-54706
OnionShare follows symlinks in shared directories, allowing unintended disclosure of local files
OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor network. Prior to 2.6.4, OnionShare CLI/Desktop follows symbolic links in cli/onionshare_cli/web/send_base_mode.py through SendBaseModeWeb.set_file_info() and stream_individual_file(), allowing remote recipients of Share or Website mode to read local files outside the selected directory. This issue is fixed in version 2.6.4.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- High
- Privileges needed
- Low
- User interaction
- Required
What an attacker can affect
- Confidentiality
- High
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
4.8
OnionShare follows symlinks in shared directories, allowing unintended disclosure of local files
OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor network. Prior to 2.6.4, OnionShare CLI/Desktop follows symbolic links in cli/onionshare_cli/web/send_base_mode.py through SendBaseModeWeb.set_file_info() and stream_individual_file(), allowing remote recipients of Share or Website mode to read local files outside the selected directory. This issue is fixed in version 2.6.4.
- Record
CVE-2026-54706- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:N/A:N - Weakness
- CWE-59
- Updated
- 2026-11-02
EUVDEUVD-2026-51571
4.8
OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor network. Prior to 2.6.4, OnionShare CLI/Desktop follows symbolic links in cli/onionshare_cli/web/send_base_mode.py through SendBaseModeWeb.set_file_info() and stream_individual_file(), allowing remote recipients of Share or Website mode to read local files outside the selected directory. This issue is fixed in version 2.6.4.
- Record
EUVD-2026-51571- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:N/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-22p9-r2f5-22mf
4.8
OnionShare follows symlinks in shared directories, allowing unintended disclosure of local files
Summary
OnionShare CLI/Desktop 2.6.3 can follow symbolic links inside a selected Share or Website directory and serve the symlink target rather than limiting access to files physically contained in the selected directory. If a user shares a directory that contains attacker-supplied or otherwise untrusted symlinks, a remote recipient with access to the OnionShare service can read arbitrary local files readable by the OnionShare process that the symlink points to.
This affects the shipped onionshare-cli Python package and the desktop application because both call the same onionshare_cli.web file-indexing and streaming code.
Details
Tested repository: https://github.com/onionshare/onionshare at commit 8cc75e1d7e88bd31f7276733449d412bf71c8999.
Affected product evidence:
cli/pyproject.tomldeclaresonionshare_cliversion2.6.3.desktop/pyproject.tomldeclaresonionshareversion2.6.3and depends ononionshare_clifrom../cli.cli/setup.pypublishesonionshare-cliand includesonionshare_cli.webplus templates/static resources.desktop/setup.pypublishesonionshareand exposes bothonionshareandonionshare-cliconsole scripts.
Reachable default/common paths:
- CLI share mode is the default mode when no
--receive,--website, or--chatflag is provided (cli/onionshare_cli/__init__.py:234-241) and accepts filesystem paths from CLI arguments (cli/onionshare_cli/__init__.py:184-189). - CLI website mode is exposed through
--website(cli/onionshare_cli/__init__.py:55-59). - Desktop Website mode calls
self.web.website_mode.set_file_info(self.filenames)before starting (desktop/onionshare/tab/mode/website_mode/__init__.py:281-287). Desktop Share mode callsself.mode.web.share_mode.set_file_info(...)before serving (desktop/onionshare/tab/mode/share_mode/threads.py:42-49). - Documentation describes Website mode as selecting files/folders and serving them over OnionShare (
docs/source/features.rst:109-115).
Root cause:
SendBaseModeWeb.set_file_info()expands a single selected directory into immediate children and recordsos.path.isfile()entries without rejecting symlinks (cli/onionshare_cli/web/send_base_mode.py:73-80,cli/onionshare_cli/web/send_base_mode.py:100-130). On POSIX,os.path.isfile()follows a symlink to a regular file.- Website mode serves any mapped file path through
stream_individual_file()(cli/onionshare_cli/web/website_mode.py:71-97).stream_individual_file()opens the mapped filesystem path directly (cli/onionshare_cli/web/send_base_mode.py:199-313, especiallyopen(file_to_download, "rb")at line 237). - Share mode default
/downloadcan include a symlink target when a single selected folder is expanded into root entries andZipWriter.add_file()callsself.z.write(filename, ...)without rejecting symlinks (cli/onionshare_cli/web/share_mode.py:473-539,cli/onionshare_cli/web/share_mode.py:574-580). - Share mode with
--no-autostop-sharingenables individual file downloads (cli/onionshare_cli/web/share_mode.py:122-125) and reaches the same direct streaming sink (cli/onionshare_cli/web/share_mode.py:430-447). - A partial mitigation exists only for recursive ZIP directory traversal:
ZipWriter.add_dir()skipsos.path.islink(full_filename)(cli/onionshare_cli/web/share_mode.py:582-600). That mitigation does not cover Website mode, Share individual downloads, or Share ZIP generation for root-level symlinks after the single-folder expansion path.
False-positive screening performed:
- URL path traversal without a mapped entry returned 404; the issue is not raw
../traversal but symlink following after a selected directory has been indexed. - Jinja/template escaping and CSP do not mitigate this because the sink is file read/streaming.
- Share mode has a symlink skip in recursive ZIP addition, but local PoC confirmed sibling paths still dereference symlinks.
- The default non-public onion service requires…
- Record
GHSA-22p9-r2f5-22mf- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:N/A:N - Weakness
- CWE-59
- Updated
- 2026-11-02
NVD
4.8
OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor network. Prior to 2.6.4, OnionShare CLI/Desktop follows symbolic links in cli/onionshare_cli/web/send_base_mode.py through SendBaseModeWeb.set_file_info() and stream_individual_file(), allowing remote recipients of Share or Website mode to read local files outside the selected directory. This issue is fixed in version 2.6.4.
- Record
CVE-2026-54706- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:N/A:N - Weakness
- CWE-59
- Updated
- 2026-11-02
OSV
4.8
OnionShare follows symlinks in shared directories, allowing unintended disclosure of local files
OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor network. Prior to 2.6.4, OnionShare CLI/Desktop follows symbolic links in cli/onionshare_cli/web/send_base_mode.py through SendBaseModeWeb.set_file_info() and stream_individual_file(), allowing remote recipients of Share or Website mode to read local files outside the selected directory. This issue is fixed in version 2.6.4.
- Record
CVE-2026-54706- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:N/A:N - Weakness
- CWE-59
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-54706
4.8
OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor network. Prior to 2.6.4, OnionShare CLI/Desktop follows symbolic links in cli/onionshare_cli/web/send_base_mode.py through SendBaseModeWeb.set_file_info() and stream_individual_file(), allowing remote recipients of Share or Website mode to read local files outside the selected directory. This issue is fixed in version 2.6.4.
- Record
DEBIAN-CVE-2026-54706- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:N/A:N - Updated
- 2026-11-02
Show 4 moreShow less
OSVGHSA-22p9-r2f5-22mf
4.8
OnionShare follows symlinks in shared directories, allowing unintended disclosure of local files
Summary
OnionShare CLI/Desktop 2.6.3 can follow symbolic links inside a selected Share or Website directory and serve the symlink target rather than limiting access to files physically contained in the selected directory. If a user shares a directory that contains attacker-supplied or otherwise untrusted symlinks, a remote recipient with access to the OnionShare service can read arbitrary local files readable by the OnionShare process that the symlink points to.
This affects the shipped onionshare-cli Python package and the desktop application because both call the same onionshare_cli.web file-indexing and streaming code.
Details
Tested repository: https://github.com/onionshare/onionshare at commit 8cc75e1d7e88bd31f7276733449d412bf71c8999.
Affected product evidence:
cli/pyproject.tomldeclaresonionshare_cliversion2.6.3.desktop/pyproject.tomldeclaresonionshareversion2.6.3and depends ononionshare_clifrom../cli.cli/setup.pypublishesonionshare-cliand includesonionshare_cli.webplus templates/static resources.desktop/setup.pypublishesonionshareand exposes bothonionshareandonionshare-cliconsole scripts.
Reachable default/common paths:
- CLI share mode is the default mode when no
--receive,--website, or--chatflag is provided (cli/onionshare_cli/__init__.py:234-241) and accepts filesystem paths from CLI arguments (cli/onionshare_cli/__init__.py:184-189). - CLI website mode is exposed through
--website(cli/onionshare_cli/__init__.py:55-59). - Desktop Website mode calls
self.web.website_mode.set_file_info(self.filenames)before starting (desktop/onionshare/tab/mode/website_mode/__init__.py:281-287). Desktop Share mode callsself.mode.web.share_mode.set_file_info(...)before serving (desktop/onionshare/tab/mode/share_mode/threads.py:42-49). - Documentation describes Website mode as selecting files/folders and serving them over OnionShare (
docs/source/features.rst:109-115).
Root cause:
SendBaseModeWeb.set_file_info()expands a single selected directory into immediate children and recordsos.path.isfile()entries without rejecting symlinks (cli/onionshare_cli/web/send_base_mode.py:73-80,cli/onionshare_cli/web/send_base_mode.py:100-130). On POSIX,os.path.isfile()follows a symlink to a regular file.- Website mode serves any mapped file path through
stream_individual_file()(cli/onionshare_cli/web/website_mode.py:71-97).stream_individual_file()opens the mapped filesystem path directly (cli/onionshare_cli/web/send_base_mode.py:199-313, especiallyopen(file_to_download, "rb")at line 237). - Share mode default
/downloadcan include a symlink target when a single selected folder is expanded into root entries andZipWriter.add_file()callsself.z.write(filename, ...)without rejecting symlinks (cli/onionshare_cli/web/share_mode.py:473-539,cli/onionshare_cli/web/share_mode.py:574-580). - Share mode with
--no-autostop-sharingenables individual file downloads (cli/onionshare_cli/web/share_mode.py:122-125) and reaches the same direct streaming sink (cli/onionshare_cli/web/share_mode.py:430-447). - A partial mitigation exists only for recursive ZIP directory traversal:
ZipWriter.add_dir()skipsos.path.islink(full_filename)(cli/onionshare_cli/web/share_mode.py:582-600). That mitigation does not cover Website mode, Share individual downloads, or Share ZIP generation for root-level symlinks after the single-folder expansion path.
False-positive screening performed:
- URL path traversal without a mapped entry returned 404; the issue is not raw
../traversal but symlink following after a selected directory has been indexed. - Jinja/template escaping and CSP do not mitigate this because the sink is file read/streaming.
- Share mode has a symlink skip in recursive ZIP addition, but local PoC confirmed sibling paths still dereference symlinks.
- The default non-public onion service requires…
- Record
GHSA-22p9-r2f5-22mf- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:N/A:N - Weakness
- CWE-59
- Updated
- 2026-11-02
OSVPYSEC-2026-3585
4.8
OnionShare follows symlinks in shared directories, allowing unintended disclosure of local files
Summary
OnionShare CLI/Desktop 2.6.3 can follow symbolic links inside a selected Share or Website directory and serve the symlink target rather than limiting access to files physically contained in the selected directory. If a user shares a directory that contains attacker-supplied or otherwise untrusted symlinks, a remote recipient with access to the OnionShare service can read arbitrary local files readable by the OnionShare process that the symlink points to.
This affects the shipped onionshare-cli Python package and the desktop application because both call the same onionshare_cli.web file-indexing and streaming code.
Details
Tested repository: https://github.com/onionshare/onionshare at commit 8cc75e1d7e88bd31f7276733449d412bf71c8999.
Affected product evidence:
cli/pyproject.tomldeclaresonionshare_cliversion2.6.3.desktop/pyproject.tomldeclaresonionshareversion2.6.3and depends ononionshare_clifrom../cli.cli/setup.pypublishesonionshare-cliand includesonionshare_cli.webplus templates/static resources.desktop/setup.pypublishesonionshareand exposes bothonionshareandonionshare-cliconsole scripts.
Reachable default/common paths:
- CLI share mode is the default mode when no
--receive,--website, or--chatflag is provided (cli/onionshare_cli/__init__.py:234-241) and accepts filesystem paths from CLI arguments (cli/onionshare_cli/__init__.py:184-189). - CLI website mode is exposed through
--website(cli/onionshare_cli/__init__.py:55-59). - Desktop Website mode calls
self.web.website_mode.set_file_info(self.filenames)before starting (desktop/onionshare/tab/mode/website_mode/__init__.py:281-287). Desktop Share mode callsself.mode.web.share_mode.set_file_info(...)before serving (desktop/onionshare/tab/mode/share_mode/threads.py:42-49). - Documentation describes Website mode as selecting files/folders and serving them over OnionShare (
docs/source/features.rst:109-115).
Root cause:
SendBaseModeWeb.set_file_info()expands a single selected directory into immediate children and recordsos.path.isfile()entries without rejecting symlinks (cli/onionshare_cli/web/send_base_mode.py:73-80,cli/onionshare_cli/web/send_base_mode.py:100-130). On POSIX,os.path.isfile()follows a symlink to a regular file.- Website mode serves any mapped file path through
stream_individual_file()(cli/onionshare_cli/web/website_mode.py:71-97).stream_individual_file()opens the mapped filesystem path directly (cli/onionshare_cli/web/send_base_mode.py:199-313, especiallyopen(file_to_download, "rb")at line 237). - Share mode default
/downloadcan include a symlink target when a single selected folder is expanded into root entries andZipWriter.add_file()callsself.z.write(filename, ...)without rejecting symlinks (cli/onionshare_cli/web/share_mode.py:473-539,cli/onionshare_cli/web/share_mode.py:574-580). - Share mode with
--no-autostop-sharingenables individual file downloads (cli/onionshare_cli/web/share_mode.py:122-125) and reaches the same direct streaming sink (cli/onionshare_cli/web/share_mode.py:430-447). - A partial mitigation exists only for recursive ZIP directory traversal:
ZipWriter.add_dir()skipsos.path.islink(full_filename)(cli/onionshare_cli/web/share_mode.py:582-600). That mitigation does not cover Website mode, Share individual downloads, or Share ZIP generation for root-level symlinks after the single-folder expansion path.
False-positive screening performed:
- URL path traversal without a mapped entry returned 404; the issue is not raw
../traversal but symlink following after a selected directory has been indexed. - Jinja/template escaping and CSP do not mitigate this because the sink is file read/streaming.
- Share mode has a symlink skip in recursive ZIP addition, but local PoC confirmed sibling paths still dereference symlinks.
- The default non-public onion service requires…
- Record
PYSEC-2026-3585- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:N/A:N - Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-54706
4.8
OnionShare is an open source tool that lets you securely and anonymously share files, host websites, and chat with friends using the Tor network. Prior to 2.6.4, OnionShare CLI/Desktop follows symbolic links in cli/onionshare_cli/web/send_base_mode.py through SendBaseModeWeb.set_file_info() and stream_individual_file(), allowing remote recipients of Share or Website mode to read local files outside the selected directory. This issue is fixed in version 2.6.4.
- Record
UBUNTU-CVE-2026-54706- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:N/A:N - Updated
- 2026-11-02
OSVopenSUSE-SU-2026:11169-1 No score
python3-onionshare-2.6.4-1.1 on GA media
These are all security issues fixed in the python3-onionshare-2.6.4-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:11169-1- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
onionshare-cliPyPI |
before 2.6.4 | 2.6.4 |
onionshareDebian:12 |
All versions, plus listed versions 2.6-42.6-52.6-5~deb12u12.6-62.6-7 Show 11 moreShow less2.6.2-12.6.2-22.6.2-32.6.2-42.6.2-52.6.3-12.6.3-22.6.3-32.6.3-42.6.4-12.6.4-2 |
None known |
onionshareDebian:13 |
before 2.6.3-1+deb13u2, plus listed versions 2.6.3-1 |
2.6.3-1+deb13u2 |
onionshareDebian:14 |
before 2.6.4-1, plus listed versions 2.6.3-12.6.3-22.6.3-32.6.3-4 |
2.6.4-1 |
onionshare-cliPyPI |
before 2.6.4, plus listed versions 2.32.3.12.3.22.3.32.52.62.6.12.6.3 |
2.6.4 |
onionshareUbuntu:Pro:16.04:LTS |
All versions, plus listed versions 0.7-10.7.1-10.8.1-10.8.1-1ubuntu0.1~esm1 |
None known |
onionshareUbuntu:Pro:18.04:LTS |
All versions, plus listed versions 0.9.2-10.9.2-1ubuntu0.1~esm1 |
None known |
onionshareUbuntu:Pro:20.04:LTS |
All versions, plus listed versions 2.1-12.2-12.2-1ubuntu0.1~esm1 |
None known |
onionshareUbuntu:Pro:22.04:LTS |
All versions, plus listed versions 2.2-32.2-3ubuntu0.1~esm1 |
None known |
onionshareUbuntu:24.04:LTS |
All versions, plus listed versions 2.6-52.6-6ubuntu12.6-6ubuntu1.1 |
None known |
onionshareUbuntu:26.04:LTS |
All versions, plus listed versions 2.6.3-12.6.3-1build12.6.3-3 |
None known |
python-onionshareopenSUSE:Tumbleweed From an advisory covering 2 CVEs |
before 2.6.4-1.1 | 2.6.4-1.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, facts | ||
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-54706 is a medium vulnerability (CVSS 4.8) in Onionshare, published July 1, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.34%, the 28th percentile. Fixed in onionshare-cli 2.6.4.
References
github.com/onionshare/onionshare/security/advisories/GHSA-22p9-r2f5-22mf
github.com/onionshare/onionshare/commit/48f31cfac077fcc9c04c67c2a6dbf87d956f5eec
github.com/onionshare/onionshare/releases/tag/v2.6.4
github.com/advisories/GHSA-22p9-r2f5-22mf
github.com/CVEProject/cvelistV5/tree/main/cves/2026/54xxx/CVE-2026-54706.json
nvd.nist.gov/vuln/detail/CVE-2026-54706
Left out here: the rest of 3 source descriptions. The JSON record has them.