Stop server-provided values from reaching a shell or escaping /dsc/seafile
Commands were joined into a string and passed to "su -c", so a login shell parsed every interpolated value. A library name is chosen on the server, and "sync -d /dsc/seafile/<name>" put it straight into that string: a library named 'Docs; touch /tmp/pwned; #' ran as an arbitrary command. Confirmed against the built image before and after this change. Every command is now an argument list executed by "runuser --", which execs directly with no shell. runuser -u sets the same HOME and a PATH that still finds the seaf-cli wrapper, so the daemon environment is unchanged. The password no longer needs its surrounding quotes, which also fixes passwords containing quotes, dollar signs, and backticks. Library names are untrusted, so dsc/paths.py reduces each one to a single path component and proves the result stays under the libraries directory with symlinks resolved. Empty, ".", "..", and names containing a separator are skipped with a warning; names that would collide are suffixed with their library ID rather than sharing a directory. Tests cover quotes, command substitutions, separators, newlines, absolute paths, parent traversal, Unicode, and colliding names. They run in a separate CI job so application failures stay distinguishable from packaging failures.
This commit is contained in:
1 parent
50ede0b2f9
commit
c15763d9f8
12 files changed
+478
-38
No files matched your search
@@ -0,0 +1,21 @@
|
||||
"""Make ``dsc.client`` importable outside the container.
|
||||
|
||||
``seafile`` and ``pysearpc`` ship with the Seafile CLI AppImage and only exist
|
||||
inside the image. The application tests must not need a live server or that
|
||||
AppImage, so a stub module stands in for the RPC client.
|
||||
"""
|
||||
|
||||
import sys
|
||||
import types
|
||||
from unittest import mock
|
||||
|
||||
|
||||
def _install_seafile_stub():
|
||||
if "seafile" in sys.modules:
|
||||
return
|
||||
seafile = types.ModuleType("seafile")
|
||||
seafile.RpcClient = mock.MagicMock(name="RpcClient")
|
||||
sys.modules["seafile"] = seafile
|
||||
|
||||
|
||||
_install_seafile_stub()
|
||||
Reference in new issue
Block a user