[Pkg-privacy-maintainers] Bug#1125775: torsocks: library not in search path, leaks user IP to endpoint

Salvatore Bonaccorso carnil at debian.org
Sat Jan 17 11:04:50 GMT 2026


Hi,

[not the maintainers here, but I'm adding intrigeri as well explicitly
for input on the change below, and this is only a preliminary cursory
look after it was raised in #debian-security IRC channel]

On Sat, Jan 17, 2026 at 09:44:44AM +0000, cacin at allfreemail.net wrote:
> Package: torsocks
> Version: 2.5.0-1
> Severity: critical
> Tags: security
> Justification: breaks unrelated software
> X-Debbugs-Cc: cacin at allfreemail.net, Debian Security Team <team at security.debian.org>
> 
> No AI was used at any stage of this bugreport.
> 
> Installing torsocks, when all the libraries it depends on (except libtorsocks)
> are already installed, results in a non-working torsocks. Due to the nature of
> what torsocks is used for, this is security-related. Additionally, non-working
> torsocks breaks the expected functionality of unrelated packages.
> 
> There are many ways in which torsocks can fail or not work, but they are either
> well-known or documented (e.g. torsocks does not work with go-based programs),
> and fixing that would require extensive changes, but that is not the point of
> this bugreport.
> 
> There exists a serious bug in the packaging of torsocks, meaning not with
> torsocks itself, but with how torsocks is being installed by the debian
> package.
> 
> On debian 13 (trixie), torsocks has the following dependencies, and all of the
> listed libraries (except libtorsocks) are already installed on a default debian
> 13 installation with xfce as the desktop environment:
> ```
> $ apt depends torsocks libtorsocks tor
> torsocks
>   Depends: libtorsocks (>= 2.5.0-1)
>   Depends: libtorsocks (<< 2.5.0-1.1~)
>   Recommends: tor
> libtorsocks
>   Depends: libc6 (>= 2.38)
>   Breaks: torsocks (<< 2.4.0-3)
>   Recommends: torsocks
>   Replaces: torsocks (<< 2.4.0-3)
> tor
>   Depends: libc6 (>= 2.38)
>   Depends: libcap2 (>= 1:2.10)
>   Depends: libevent-2.1-7t64 (>= 2.1.8-stable)
>   Depends: liblzma5 (>= 5.1.1alpha+20120614)
>   Depends: libseccomp2 (>= 0.0.0~20120605)
>   Depends: libssl3t64 (>= 3.0.0)
>   Depends: libsystemd0
>   Depends: libzstd1 (>= 1.5.5)
>   Depends: zlib1g (>= 1:1.1.4)
>   Depends: adduser
>   Depends: runit-helper (>= 2.14.0~)
>   Depends: lsb-base
>     sysvinit-utils
>   Conflicts: <libssl0.9.8> (<< 0.9.8g-9)
>   Breaks: runit (<< 2.1.2-51~)
>   Recommends: logrotate
>   Recommends: tor-geoipdb
>   Recommends: torsocks
> ```
> 
> Installing torsocks on such a system will not install any new libraries (except
> libtorsocks):
> ```
> # apt -V install torsocks
> Installing:
>    torsocks (2.5.0-1)
> 
> Installing dependencies:
>    libtorsocks (2.5.0-1)
>    tor (0.4.8.16-1)
>    tor-geoipdb (0.4.8.16-1)
> 
> Suggested packages:
>    mixmaster
>    torbrowser-launcher (0.3.7-3)
>    socat (1.8.0.3-1)
>    apparmor-utils (4.1.0-1)
>    nyx (2.1.0-3)
>    obfs4proxy (0.0.14-2+b5)
> 
> Summary:
>   Upgrading: 0, Installing: 4, Removing: 0, Not Upgrading: 3
>   Download size: 4563 kB
>   Space needed: 26.6 MB / 7590 MB available
> 
> Continue? [Y/n] y
> Get:1 http://deb.debian.org/debian trixie/main amd64 libtorsocks amd64 2.5.0-1 [67.5 kB]
> Get:2 http://deb.debian.org/debian trixie/main amd64 tor amd64 0.4.8.16-1 [2054 kB]
> Get:3 http://deb.debian.org/debian trixie/main amd64 tor-geoipdb all 0.4.8.16-1 [2413 kB]
> Get:4 http://deb.debian.org/debian trixie/main amd64 torsocks all 2.5.0-1 [27.6 kB]
> Fetched 4563 kB in 0s (31.4 MB/s)
> Selecting previously unselected package libtorsocks:amd64.
> (Reading database ... 103713 files and directories currently installed.)
> Preparing to unpack .../libtorsocks_2.5.0-1_amd64.deb ...
> Unpacking libtorsocks:amd64 (2.5.0-1) ...
> Selecting previously unselected package tor.
> Preparing to unpack .../tor_0.4.8.16-1_amd64.deb ...
> Unpacking tor (0.4.8.16-1) ...
> Selecting previously unselected package tor-geoipdb.
> Preparing to unpack .../tor-geoipdb_0.4.8.16-1_all.deb ...
> Unpacking tor-geoipdb (0.4.8.16-1) ...
> Selecting previously unselected package torsocks.
> Preparing to unpack .../torsocks_2.5.0-1_all.deb ...
> Unpacking torsocks (2.5.0-1) ...
> Setting up tor (0.4.8.16-1) ...
> Something or somebody made /var/lib/tor disappear.
> Creating one for you again.
> Something or somebody made /var/log/tor disappear.
> Creating one for you again.
> Created symlink '/etc/systemd/system/multi-user.target.wants/tor.service' → '/usr/lib/systemd/system/tor.service'.
> Setting up libtorsocks:amd64 (2.5.0-1) ...
> Setting up tor-geoipdb (0.4.8.16-1) ...
> Setting up torsocks (2.5.0-1) ...
> Processing triggers for man-db (2.13.1-1) ...
> ```
> 
> Attempting to run torsocks right after installing it results in it failing:
> ```
> $ torsocks /bin/true
> ERROR: ld.so: object 'libtorsocks.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
> ```
> 
> The reason why this bug is serious is because a user might attempt to run
> torsocks immediately after installing it, relying on sending the data through
> the tor network instead of through their regular internet connection, and thus
> the user's IP address is revealed to the endpoint:
> ```
> $ torsocks curl https://check.torproject.org/api/ip
> ERROR: ld.so: object 'libtorsocks.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
> {"IsTor":false,"IP":"<redacted real IP address>"}
> ```
> 
> Running strace reveals that libtorsocks.so is not found, because it is located
> in the /usr/lib/x86_64-linux-gnu/torsocks/ directory, and that directory is not
> being searched:
> ```
> $ strace -e openat,newfstatat torsocks /bin/true
> openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
> openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
> newfstatat(AT_FDCWD, "/home/user", {st_mode=S_IFDIR|0700, st_size=4096, ...}, 0) = 0
> newfstatat(AT_FDCWD, ".", {st_mode=S_IFDIR|0700, st_size=4096, ...}, 0) = 0
> openat(AT_FDCWD, "/usr/bin/torsocks", O_RDONLY) = 3
> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1191, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1193, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1197, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1203, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1204, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1205, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
> newfstatat(AT_FDCWD, "/bin/true", {st_mode=S_IFREG|0755, st_size=43432, ...}, 0) = 0
> newfstatat(AT_FDCWD, "/bin/true", {st_mode=S_IFREG|0755, st_size=43432, ...}, 0) = 0
> openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
> openat(AT_FDCWD, "/lib/x86_64-linux-gnu/glibc-hwcaps/x86-64-v2/libtorsocks.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> newfstatat(AT_FDCWD, "/lib/x86_64-linux-gnu/glibc-hwcaps/x86-64-v2/", 0x7ffe2ac4b250, 0) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libtorsocks.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> newfstatat(AT_FDCWD, "/lib/x86_64-linux-gnu/", {st_mode=S_IFDIR|0755, st_size=94208, ...}, 0) = 0
> openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/glibc-hwcaps/x86-64-v2/libtorsocks.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> newfstatat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/glibc-hwcaps/x86-64-v2/", 0x7ffe2ac4b250, 0) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/libtorsocks.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> newfstatat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/", {st_mode=S_IFDIR|0755, st_size=94208, ...}, 0) = 0
> openat(AT_FDCWD, "/lib/glibc-hwcaps/x86-64-v2/libtorsocks.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> newfstatat(AT_FDCWD, "/lib/glibc-hwcaps/x86-64-v2/", 0x7ffe2ac4b250, 0) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/lib/libtorsocks.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> newfstatat(AT_FDCWD, "/lib/", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0
> openat(AT_FDCWD, "/usr/lib/glibc-hwcaps/x86-64-v2/libtorsocks.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> newfstatat(AT_FDCWD, "/usr/lib/glibc-hwcaps/x86-64-v2/", 0x7ffe2ac4b250, 0) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/usr/lib/libtorsocks.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> newfstatat(AT_FDCWD, "/usr/lib/", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0
> ERROR: ld.so: object 'libtorsocks.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
> openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
> +++ exited with 0 +++
> ```
> 
> Checking which libraries are cached in /etc/ld.so.cache shows that there is no
> mention of libtorsocks:
> ```
> $ /sbin/ldconfig -p | grep libtorsocks
> [no output here]
> ```
> 
> Regenerating the /etc/ld.so.cache and checking for presence of libtorsocks
> again:
> ```
> # ldconfig
> $ /sbin/ldconfig -p | grep libtorsocks
>         libtorsocks.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/torsocks/libtorsocks.so.0
>         libtorsocks.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/torsocks/libtorsocks.so
> ```
> 
> Running strace again shows that libtorsocks.so is immediately found:
> ```
> $ strace -e openat,newfstatat torsocks /bin/true
> openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
> openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
> newfstatat(AT_FDCWD, "/home/user", {st_mode=S_IFDIR|0700, st_size=4096, ...}, 0) = 0
> newfstatat(AT_FDCWD, ".", {st_mode=S_IFDIR|0700, st_size=4096, ...}, 0) = 0
> openat(AT_FDCWD, "/usr/bin/torsocks", O_RDONLY) = 3
> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2752, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2754, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2758, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2764, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2765, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2766, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
> newfstatat(AT_FDCWD, "/bin/true", {st_mode=S_IFREG|0755, st_size=43432, ...}, 0) = 0
> newfstatat(AT_FDCWD, "/bin/true", {st_mode=S_IFREG|0755, st_size=43432, ...}, 0) = 0
> openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
> openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/torsocks/libtorsocks.so", O_RDONLY|O_CLOEXEC) = 3
> openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
> openat(AT_FDCWD, "/etc/tor/torsocks.conf", O_RDONLY) = 3
> +++ exited with 0 +++
> ```
> 
> Running torsocks again after regenerating the cache makes the error message
> disappear and torsocks works fine, the IP address is the address of the tor
> exit node instead of the IP address of the user:
> ```
> $ torsocks curl https://check.torproject.org/api/ip
> {"IsTor":true,"IP":"185.220.101.13"}
> ```
> 
> For comparison, if torsocks is installed on a system that doesn't have all the
> libraries already, such as on a headless system with no desktop environment:
> ```
> # sudo apt -V install torsocks
> Installing:
>    torsocks (2.5.0-1)
> 
> Installing dependencies:
>    libevent-2.1-7t64 (2.1.12-stable-10+b1)
>    libtorsocks (2.5.0-1)
>    tor (0.4.8.16-1)
>    tor-geoipdb (0.4.8.16-1)
> 
> Suggested packages:
>    mixmaster
>    torbrowser-launcher (0.3.7-3)
>    socat (1.8.0.3-1)
>    apparmor-utils (4.1.0-1)
>    nyx (2.1.0-3)
>    obfs4proxy (0.0.14-2+b5)
> 
> Summary:
>   Upgrading: 0, Installing: 5, Removing: 0, Not Upgrading: 0
>   Download size: 4744 kB
>   Space needed: 27.0 MB / 10.5 GB available
> 
> Continue? [Y/n] y
> Get:1 http://deb.debian.org/debian trixie/main amd64 libevent-2.1-7t64 amd64 2.1.12-stable-10+b1 [182 kB]
> Get:2 http://deb.debian.org/debian trixie/main amd64 libtorsocks amd64 2.5.0-1 [67.5 kB]
> Get:3 http://deb.debian.org/debian trixie/main amd64 tor amd64 0.4.8.16-1 [2054 kB]
> Get:4 http://deb.debian.org/debian trixie/main amd64 tor-geoipdb all 0.4.8.16-1 [2413 kB]
> Get:5 http://deb.debian.org/debian trixie/main amd64 torsocks all 2.5.0-1 [27.6 kB]
> Fetched 4744 kB in 0s (37.6 MB/s)
> Selecting previously unselected package libevent-2.1-7t64:amd64.
> (Reading database ... 28823 files and directories currently installed.)
> Preparing to unpack .../libevent-2.1-7t64_2.1.12-stable-10+b1_amd64.deb ...
> Unpacking libevent-2.1-7t64:amd64 (2.1.12-stable-10+b1) ...
> Selecting previously unselected package libtorsocks:amd64.
> Preparing to unpack .../libtorsocks_2.5.0-1_amd64.deb ...
> Unpacking libtorsocks:amd64 (2.5.0-1) ...
> Selecting previously unselected package tor.
> Preparing to unpack .../tor_0.4.8.16-1_amd64.deb ...
> Unpacking tor (0.4.8.16-1) ...
> Selecting previously unselected package tor-geoipdb.
> Preparing to unpack .../tor-geoipdb_0.4.8.16-1_all.deb ...
> Unpacking tor-geoipdb (0.4.8.16-1) ...
> Selecting previously unselected package torsocks.
> Preparing to unpack .../torsocks_2.5.0-1_all.deb ...
> Unpacking torsocks (2.5.0-1) ...
> Setting up libevent-2.1-7t64:amd64 (2.1.12-stable-10+b1) ...
> Setting up tor (0.4.8.16-1) ...
> Something or somebody made /var/lib/tor disappear.
> Creating one for you again.
> Something or somebody made /var/log/tor disappear.
> Creating one for you again.
> Created symlink '/etc/systemd/system/multi-user.target.wants/tor.service' → '/usr/lib/systemd/system/tor.service'.
> Setting up libtorsocks:amd64 (2.5.0-1) ...
> Setting up tor-geoipdb (0.4.8.16-1) ...
> Setting up torsocks (2.5.0-1) ...
> Processing triggers for man-db (2.13.1-1) ...
> Processing triggers for libc-bin (2.41-12+deb13u1) ...
> ```
> 
> Notice the last line of that log: "Processing triggers for libc-bin (2.41-12+deb13u1) ...".
> This line was missing when installing torsocks on debian 13 with xfce.
> 
> This line is emitted in this instance because the libevent-2.1-7t64 library was
> not installed on the system before attempting to install torsocks, and
> installing it led to the regeneration of /etc/ld.so.cache and because the cache
> is regenerated, libtorsocks is found:
> ```
> $ /sbin/ldconfig -p | grep libtorsocks
>         libtorsocks.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/torsocks/libtorsocks.so.0
>         libtorsocks.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/torsocks/libtorsocks.so
> ```
> 
> And torsocks immediately works after installing it, with no error message, and
> the IP address is the IP of the tor exit node, not the user.
> ```
> $ torsocks curl https://check.torproject.org/api/ip
> {"IsTor":true,"IP":"107.189.3.94"}
> ```
> 
> This problem did not exist on debian 12 (bookworm). It was introduced in
> torsocks 2.5.0-1, I see a few mentions in the changelog [1] for that version
> about how the library is packaged. Most suspect are the changes to the
> debian/rules file [2].
> 
> ldconfig has to be run as part of the package installation, or the libtorsocks
> package has to be changed to somehow make the system know to regenerate the
> library cache.
> 
> Some users will accidentally avoid the problem, if they install some package
> that installs libraries to the system, after installing torsocks, if that leads
> to the library cache regeneration.
> 
> By the way torsocks is one of the 3 packages (fakechroot, fakeroot, torsocks)
> in all of debian that has the Lintian tag: package-modifies-ld.so-search-path
> and unlike fakechroot, it is not overridden [3].
> 
> As a final note I am aware of at least one system that has an automated script
> that installs torsocks, checks if the installation succeeded, checks if the tor
> service is running, and tries to send some data through torsocks immediately
> afterwards. This has led to revealing the IP address of that system to the
> endpoint. So the bug is not just a theoretical problem.
> 
> [1] https://tracker.debian.org/media/packages/t/torsocks/changelog-2.5.0-1
> [2] https://salsa.debian.org/pkg-privacy-team/torsocks/-/commits/debian/2.5.0-1/debian/rules
> [3] https://udd.debian.org/lintian-tag/package-modifies-ld.so-search-path?affected=yes

It looks that in debian/rules the call for dh_makeshlibs is explicitly
overriden, otherwise a trigger for registering 'activate-nowait
ldconfig' would be generated. This should resolve the issue, but then
one needs to explicitly override both

E: libtorsocks: package-modifies-ld.so-search-path [etc/ld.so.conf.d/torsocks-x86_64-linux-gnu.conf]
W: libtorsocks: package-has-unnecessary-activation-of-ldconfig-trigger

because then this would be actually intended? intrigeri is this
correct?

Regards,
Salvatore



More information about the Pkg-privacy-maintainers mailing list