tomb

the crypto undertaker
git clone git://parazyd.org/tomb.git
Log | Files | Refs | README | LICENSE

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:
Mtomb | 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