summaryrefslogtreecommitdiffstats
path: root/krebs
diff options
context:
space:
mode:
authormakefu <github@syntax-fehler.de>2016-11-08 16:48:58 +0100
committermakefu <github@syntax-fehler.de>2016-11-08 16:48:58 +0100
commitdbb25f7288be2c9d2afe796d63d1a070e353daca (patch)
treef33630255ec39e4db545eaa63e5acff55efbafdf /krebs
parent6e8e38be163904fe138b4d8dd0bec2e1b8bd317c (diff)
k 5 Reaktor: harden sed-plugin
Diffstat (limited to 'krebs')
-rw-r--r--krebs/5pkgs/Reaktor/plugins.nix2
-rw-r--r--krebs/5pkgs/Reaktor/scripts/sed-plugin.py17
2 files changed, 16 insertions, 3 deletions
diff --git a/krebs/5pkgs/Reaktor/plugins.nix b/krebs/5pkgs/Reaktor/plugins.nix
index a483db32..242373ce 100644
--- a/krebs/5pkgs/Reaktor/plugins.nix
+++ b/krebs/5pkgs/Reaktor/plugins.nix
@@ -59,7 +59,7 @@ rec {
};
sed-plugin = buildSimpleReaktorPlugin "sed-plugin" {
- path = [ pkgs.gnused pkgs.python3 ];
+ path = [ pkgs.gnused pkgs.proot pkgs.python3 ];
# only support s///gi the plugin needs to see every msg
# TODO: this will eat up the last regex, fix Reaktor to support fallthru
append_rule = true;
diff --git a/krebs/5pkgs/Reaktor/scripts/sed-plugin.py b/krebs/5pkgs/Reaktor/scripts/sed-plugin.py
index 8103c958..6039aeb4 100644
--- a/krebs/5pkgs/Reaktor/scripts/sed-plugin.py
+++ b/krebs/5pkgs/Reaktor/scripts/sed-plugin.py
@@ -34,9 +34,22 @@ if m:
flagstr = ''
last = d.get(usr,None)
if last:
- #print(re.sub(fn,tn,last,count=count,flags=flags))
from subprocess import Popen,PIPE
- p = Popen(['sed','s/{}/{}/{}'.format(f,t,flagstr)],stdin=PIPE,stdout=PIPE )
+ import shutil
+ from os.path import realpath
+ # sed only needs stdin/stdout, we protect state_dir with this
+ # input to read/write arbitrary files:
+ # s/.\/\/; w /tmp/i (props to waldi)
+ # conclusion: sed is untrusted and we handle it like this
+ p = Popen(['proot',
+ # '-v','1',
+ '-w','/', # cwd is root
+ '-b','/nix/store', # mount important folders
+ '-b','/usr',
+ '-b','/bin',
+ '-r','/var/empty', # chroot to /var/empty
+ realpath(shutil.which('sed')),
+ 's/{}/{}/{}'.format(f,t,flagstr)],stdin=PIPE,stdout=PIPE )
so,se = p.communicate(bytes("{}\n".format(last),"UTF-8"))
if p.returncode:
print("something went wrong when trying to process your regex: {}".format(se.decode()))