On Thu, Feb 04, 2010 at 09:40:08AM +1300, martin f krafft wrote:
> also sprach [email protected] <[email protected]> [2010.02.03.0021 +1300]:
> > I still think the patch is a valuable addition to molly-guard, as
> > it fixes a problem I and maybe others have. I think that holding
> > this patch back because you feel molly-guard needs to be rewritten
> > is the wrong thing to do.
>
> There is no reason for me *not* to include it, so I will.
Great :).
> However, there is one remaining problem, as far as I can see. While
> your patch gets rid of the pgrep-based approach and hence solves the
> kFreeBSD-problem, where the tty-name of the sshd process is not
> exported by ps, it introduces another Linux-ism:
>
> EXE=$(basename $(readlink /proc/$PARENT/exe) )
>
> /proc/$PARENT/exe does not exist on FreeBSD. Can you fathom another
> way to achieve this?
Since I don't have a kfreebsd machine I asked in irc.debian.org/#debian-kbsd,
where I have been told that kfreebsd normally does have /proc mounted and the
exe link exists.
We discovered one bash-ism, but the test for /proc/$PID/exe worked.
Attached is an updated version of the patch fixing said bash-ism.
regards
Stefan
--
You will be winged by an anti-aircraft battery.
diff --git a/rc b/rc
index d5b87cc..eb456ed 100644
--- a/rc
+++ b/rc
@@ -4,3 +4,9 @@
# when set, causes the 30-query-hostname script to always ask for the
# hostname, even if no SSH session was detected.
#ALWAYS_QUERY_HOSTNAME=true
+#
+# CHECK_IMAGES
+#
+# Space seperated list of image names to look for and if found to protect
+# against.
+CHECK_IMAGES="sshd screen"
diff --git a/run.d/30-query-hostname b/run.d/30-query-hostname
index d040603..0aa9833 100755
--- a/run.d/30-query-hostname
+++ b/run.d/30-query-hostname
@@ -3,6 +3,7 @@
# 30-ask-hostname - request the user to type in the hostname of the local host
#
# Copyright © martin f. krafft <[email protected]>
+# Copyright © 2009-2010 Stefan Völkel <[email protected]>
# Released under the terms of the Artistic Licence 2.0
#
set -eu
@@ -21,28 +22,57 @@ done
# require an interactive terminal connected to stdin
test -t 0 || exit 0
-# we've been asked to always protect this host
+# whether we should check for an ssh session or not
+CHECK=1
+
+# should we bypass ssh session checking and handle as if we found one?
+if [ $PRETEND_SSH -eq 1 ]; then
+ CHECK=0
+ echo "I: $ME: --pretend-ssh was given, handling as ssh session" >&2
+fi
+
+# should this hostname always be guarded?
case "${ALWAYS_QUERY_HOSTNAME:-0}" in
0|false|False|no|No|off|Off)
- # only run if we are being called over SSH, that is if the current terminal
- # was created by sshd.
- PTS=$(readlink /proc/$$/fd/0)
- if ! pgrep -f "^sshd.+${PTS#/dev/}\>" >/dev/null \
- && [ -z "${SSH_CONNECTION:-}" ]; then
- if [ $PRETEND_SSH -eq 1 ]; then
- echo "I: $ME: this is not an SSH session, but --pretend-ssh was given..." >&2
- else
- exit 0
- fi
- else
- echo "W: $ME: SSH session detected!" >&2
- fi
- ;;
+ ;;
*)
+ CHECK=0
echo "I: $ME: $MOLLYGUARD_CMD is always molly-guarded on this system." >&2
;;
esac
+# bypass image check?
+if [ $CHECK -ne 0 ]; then
+ # no, set parent pid
+ PARENT=$$
+
+ FOUND=""
+ # keep looking at parent pid until ...
+ while [ -z $FOUND ]; do
+ # ... no more parents
+ # => molly-guard was NOT started as child of sshd
+ # => this is NOT an ssh/screen/whatever session
+ # => reboot/halt/... as requested
+ [ $PARENT -eq 0 ] && exit 0
+
+ # find out image name
+ EXE=$(basename $(readlink /proc/$PARENT/exe) )
+
+ # ... parent image is one of sshd, screen
+ for p in $CHECK_IMAGES; do
+ if [ "$p" = "$EXE" ]; then
+ FOUND=$p
+ break;
+ fi
+ done
+
+ # get next pid
+ PARENT=$(ps -o "ppid=" $PARENT | sed 's/^ \+//')
+ done
+
+ echo "I: $ME: $FOUND found." >&2
+fi
+
HOSTNAME="$(hostname --short)"
sigh()