commit a10d6af8047794ad2960b24e9a3dc4bdccf26c83
parent e95b32e3a35a1049241e8d00b437da78e3fc5afc
Author: Jaromil <jaromil@dyne.org>
Date: Sun, 23 Nov 2014 14:49:41 +0100
Removed handling of temporary directory
Added the --tmp flag for manual selection of the temporary directory, whose security should really be up to sysadmins when configuring operating systems. Default is ZSh TMPPREFIX usually set to /tmp/zsh which, if not existing, will be created as world writable with a sticky bit.
This commit also includes a cleanup of commandline options and a fix to swap check.
Diffstat:
M | tomb | | | 108 | +++++++++++++++++++++++++++++-------------------------------------------------- |
1 file changed, 39 insertions(+), 69 deletions(-)
diff --git a/tomb b/tomb
@@ -42,6 +42,8 @@
typeset VERSION="2.0"
typeset DATE="Nov/2014"
typeset TOMBEXEC=$0
+typeset TMPPREFIX=${TMPPREFIX:-/tmp}
+# TODO: configure which tmp dir to use from a cli flag
# Tomb is using some global variables set by the shell:
# TMPPREFIX, UID, GID, PATH, TTY, USERNAME
@@ -180,13 +182,11 @@ _whoami() {
option_is_set -U \
&& _UID=$(option_value -U) || _UID=$(id -u $_USER)
-# _verbose "Identified caller: ::1 username:: (::2 UID:::::3 GID::)" \
-# $_USER $_UID $_GID
+ _verbose "Identified caller: ::1 username:: (::2 UID:::::3 GID::)" $_USER $_UID $_GID
# Update USERNAME accordingly if we can
[[ EUID == 0 && $_USER != $USERNAME ]] && {
-# _verbose "Updating USERNAME from '::1 USERNAME::' to '::2 _USER::')" \
-# $USERNAME $_USER
+ _verbose "Updating USERNAME from '::1 USERNAME::' to '::2 _USER::')" $USERNAME $_USER
USERNAME=$_USER
}
@@ -203,48 +203,6 @@ _whoami() {
}
-# Ensure temporary files remain in RAM
-# Set global variable TMPPREFIX
-# TODO: configure which tmp dir to use from a cli flag
-_ensure_safe_memory check_shm() {
-
- local shmprefix="" # Path prefix for safe temporary files
-
- # Set $shmprefix to something sensible
- [[ -z $shmprefix && -k "/dev/shm" ]] \
- && shmprefix="/dev/shm" || shmprefix="/run/shm"
-
- _whoami # Set _UID and _GID for later
-
- # Mount the tmpfs if the OS doesn't already
- [[ -k $shmprefix ]] || {
- mkdir $shmprefix
- [[ $? = 0 ]] || _failure "Fatal error creating a directory in shared memory."
- }
-
- [[ -r $shmprefix/$_UID ]] || {
- mkdir -m 700 $shmprefix/$_UID
- [[ $? = 0 ]] || {
- _failure "Fatal error creating a directory for temporary files" }
- }
-
- # Ensure all temporary files go into a user-specific directory for
- # additional safety
- # mount -t tmpfs tmpfs $shmprefix/$_UID \
- # -o nosuid,noexec,nodev,mode=0700,uid=$_UID,gid=$_GID
- # [[ $? == 0 ]] || {
- # _failure "Cannot mount tmpfs in ::1 shm path::" $shmprefix }
-
- # Set a global environment variable to ensure zsh will use that
- # directory in RAM to keep temporary files by setting an. They
- # will be created on demand and deleted as soon as the function
- # using them ends.
- TMPPREFIX="$shmprefix/$_UID"
-
- return 0
-
-}
-
# Define sepulture's plot (setup tomb-related arguments)
# Synopsis: _plot /path/to/the.tomb
_plot() {
@@ -274,21 +232,32 @@ _plot() {
# Provide a random filename in shared memory
_tmp_create() {
+ [[ -d "$TMPPREFIX" ]] || {
+ mkdir -m 777 "$TMPPREFIX"
+ [[ $? == 0 ]] || _failure "Fatal error creating the temporary directory: ::1 temp dir::" "$TMPPREFIX"
+ # we create the tempdir with the sticky bit on
+ chmod o+t "$TMPPREFIX"
+ }
- tfile="${TMPPREFIX}/$RANDOM$RANDOM$RANDOM" # Temporary file
+ # We're going to add one more $RANDOM for each time someone complain
+ # about this being too weak of a random.
+ tfile="${TMPPREFIX}/$RANDOM$RANDOM$RANDOM$RANDOM" # Temporary file
umask 066
[[ $? == 0 ]] || {
_failure "Fatal error setting the permission umask for temporary files" }
- touch $tfile
+ [[ -r "$tfile" ]] && {
+ _failure "Someone is messing up with us trying to hijack temporary files." }
+
+ touch "$tfile"
[[ $? == 0 ]] || {
- _failure "Fatal error creating a temporary file: ::1 temp file::" $tfile }
+ _failure "Fatal error creating a temporary file: ::1 temp file::" "$tfile" }
- chown $_UID:$_GID $tfile
+ chown $_UID:$_GID "$tfile"
[[ $? == 0 ]] || {
- _failure "Fatal error setting ownership on temporary file: ::1 temp file::" $tfile }
+ _failure "Fatal error setting ownership on temporary file: ::1 temp file::" "$tfile" }
- _verbose "Created tempfile: ::1 temp file::" $tfile
+ _verbose "Created tempfile: ::1 temp file::" "$tfile"
TOMBTMP="$tfile"
TOMBTMPFILES+=("$tfile")
@@ -357,7 +326,6 @@ _check_swap() {
return 0
;;
*) # Unencrypted swap
- return 1
_failure "Operation aborted."
;;
esac
@@ -403,7 +371,7 @@ EOF`
# Drop privileges
exec_as_user() {
if ! [ $SUDO_USER ]; then
- exec $@[@]
+ exec ${@[@]}
return $?
fi
_verbose "exec_as_user '::1 user::': ::2::" $SUDO_USER ${(f)@}
@@ -1079,8 +1047,7 @@ gen_key() {
_failure "User aborted."
fi
if [ -z $tombpass ]; then
- _warning "You set empty password, which is not possible."
- continue
+ _failure "You set empty password, which is not possible."
fi
tombpasstmp=$tombpass
tombpass=`exec_as_user ${TOMBEXEC} askpass "Type the new password to secure your key (again)"`
@@ -1347,7 +1314,6 @@ dig_tomb() {
[[ $tombsize == <-> ]] || _failure "Size must be an integer (megabytes)"
[[ $tombsize -ge 10 ]] || _failure "Tombs can't be smaller than 10 megabytes"
- _check_swap # Ensure the available memory is safe to use
_plot $tombpath # Set TOMB{PATH,DIR,FILE,NAME}
[[ -e $TOMBPATH ]] && {
@@ -2416,7 +2382,6 @@ slam_tomb() {
main() {
_ensure_dependencies # Check dependencies are present or bail out
- _ensure_safe_memory # Check available memory can be used safely
local -A subcommands_opts
### Options configuration
@@ -2439,20 +2404,20 @@ main() {
# can only use the non-abbreviated long-option version like:
# -force and NOT -f
#
- main_opts=(q -quiet=q D -debug=D h -help=h v -version=v U: -uid=U G: -gid=G T: -tty=T -no-color -unsafe)
+ main_opts=(q -quiet=q D -debug=D h -help=h v -version=v f -force=f -tmp: U: G: T: -no-color -unsafe)
subcommands_opts[__default]=""
- subcommands_opts[open]="f -force n -nohook=n k: -key=k -kdf: o: -ignore-swap -sudo-pwd: -tomb-pwd: "
+ subcommands_opts[open]="n -nohook=n k: -kdf: o: -ignore-swap -sudo-pwd: -tomb-pwd: "
subcommands_opts[mount]=${subcommands_opts[open]}
subcommands_opts[create]="" # deprecated, will issue warning
- subcommands_opts[forge]="f -force -ignore-swap k: -key=k -kdf: o: -tomb-pwd: -use-urandom "
- subcommands_opts[dig]="f -force -ignore-swap s: -size=s "
- subcommands_opts[lock]="f -force -ignore-swap k: -key=k -kdf: o: -sudo-pwd: -tomb-pwd: "
- subcommands_opts[setkey]="k: -key=k f -force -ignore-swap -kdf: -sudo-pwd: -tomb-old-pwd: -tomb-pwd: "
- subcommands_opts[engrave]="k: -key=k "
+ subcommands_opts[forge]="-ignore-swap k: -kdf: o: -tomb-pwd: -use-urandom "
+ subcommands_opts[dig]="-ignore-swap s: -size=s "
+ subcommands_opts[lock]="-ignore-swap k: -kdf: o: -sudo-pwd: -tomb-pwd: "
+ subcommands_opts[setkey]="k: -ignore-swap -kdf: -sudo-pwd: -tomb-old-pwd: -tomb-pwd: "
+ subcommands_opts[engrave]="k: "
- subcommands_opts[passwd]="k: -key=k f -force -ignore-swap -kdf: -tomb-old-pwd: -tomb-pwd: "
+ subcommands_opts[passwd]="k: -ignore-swap -kdf: -tomb-old-pwd: -tomb-pwd: "
subcommands_opts[close]="-sudo-pwd: "
subcommands_opts[help]=""
subcommands_opts[slam]=""
@@ -2462,14 +2427,14 @@ main() {
subcommands_opts[search]=""
subcommands_opts[help]=""
- subcommands_opts[bury]="f -force k: -key=k -tomb-pwd: "
- subcommands_opts[exhume]="f -force k: -key=k -tomb-pwd: "
+ subcommands_opts[bury]="k: -tomb-pwd: "
+ subcommands_opts[exhume]="k: -tomb-pwd: "
# subcommands_opts[decompose]=""
# subcommands_opts[recompose]=""
# subcommands_opts[install]=""
subcommands_opts[askpass]=""
subcommands_opts[source]=""
- subcommands_opts[resize]="f -force -ignore-swap s: -size=s k: -key=k -tomb-pwd: "
+ subcommands_opts[resize]="-ignore-swap s: -size=s k: -tomb-pwd: "
subcommands_opts[check]="-ignore-swap "
# subcommands_opts[translate]=""
@@ -2548,6 +2513,9 @@ main() {
exitv=127 _failure "You specified option ::1 option::, which is DANGEROUS and should only be used for testing\nIf you really want so, add --unsafe" $opt }
done
}
+ # read -t or --tmp flags to set a custom temporary directory
+ option_is_set --tmp && TMPPREFIX=$(option_value --tmp)
+
# When we run as root, we remember the original uid:gid to set
# permissions for the calling user and drop privileges
@@ -2564,6 +2532,8 @@ main() {
$_UID $_GID $_TTY
}
+ _verbose "Temporary directory: $TMPPREFIX"
+
# Process subcommand
case "$subcommand" in