From 537bb6aaebb5ff27e1f6786341a991d4b56b87bf Mon Sep 17 00:00:00 2001 From: Narrat Date: Fri, 3 Feb 2017 17:39:09 +0100 Subject: [PATCH 1/6] Use of lsof to fix slam for specific mountpoint Apparantly fuser didn't report back, if the tomb was mounted in a subdir of /run (whereas /run itself is often a tmpfs mount). With no list of process ids those couldn't be killed, so slamming the tomb failed. lsof is capable to report back the sought information. Fixes #220 Additionally fixing the debug output, where a hardcoded mountpoint was used --- INSTALL.md | 1 + tomb | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 996ada3..56a8bc7 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -9,6 +9,7 @@ Tomb needs a few programs to be installed on a system in order to work: * gnupg * cryptsetup * pinentry-curses (and/or -gtk-2, -x11, -qt) + * lsof Most systems provide these tools in their package collection, for instance on Debian/Ubuntu one can use `apt-get install` on Fedora and diff --git a/tomb b/tomb index 1a1a632..57260a7 100755 --- a/tomb +++ b/tomb @@ -2506,20 +2506,20 @@ umount_tomb() { # Kill all processes using the tomb slam_tomb() { # $1 = tomb mount point - if [[ -z `fuser -m "$1" 2>/dev/null` ]]; then + if [[ -z `lsof -t +D "$1" 2>/dev/null` ]]; then return 0 fi #Note: shells are NOT killed by INT or TERM, but they are killed by HUP for s in TERM HUP KILL; do _verbose "Sending ::1:: to processes inside the tomb:" $s if option_is_set -D; then - ps -fp `fuser -m /media/a.tomb 2>/dev/null`| + ps -fp `lsof -t +D "$1" 2>/dev/null`| while read line; do _verbose $line done fi - fuser -s -m "$1" -k -M -$s - if [[ -z `fuser -m "$1" 2>/dev/null` ]]; then + kill -$s `lsof -t +D "$1"` + if [[ -z `lsof -t +D "$1" 2>/dev/null` ]]; then return 0 fi if ! option_is_set -f; then From b2ee2114cff508dfab8277559840aaa7865cc058 Mon Sep 17 00:00:00 2001 From: Narrat Date: Sun, 5 Feb 2017 20:03:29 +0100 Subject: [PATCH 2/6] Make lsof an optional dep tomb doesn't need lsof for anything else, and can work regulary without it. So make it an optional feature, which allows to slam a tomb if lsof is installed Updates additionally the man page and generates a new pdf from it --- INSTALL.md | 2 +- doc/tomb.1 | 6 +++--- doc/tomb_manpage.pdf | Bin 21750 -> 30887 bytes tomb | 9 ++++++++- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 56a8bc7..e25e7a0 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -9,7 +9,6 @@ Tomb needs a few programs to be installed on a system in order to work: * gnupg * cryptsetup * pinentry-curses (and/or -gtk-2, -x11, -qt) - * lsof Most systems provide these tools in their package collection, for instance on Debian/Ubuntu one can use `apt-get install` on Fedora and @@ -67,6 +66,7 @@ Tomb can use some optional tools to extend its functionalities: executable | function ---------- | --------------------------------------------------- + lsof | slam a tomb (close even if open programs) dcfldd | show progress while digging tombs and keys steghide | bury and exhume keys inside images resizefs | extend the size of existing tomb volumes diff --git a/doc/tomb.1 b/doc/tomb.1 index 775bc19..d032bd8 100644 --- a/doc/tomb.1 +++ b/doc/tomb.1 @@ -1,4 +1,4 @@ -.TH tomb 1 "November 26, 2014" "tomb" +.TH tomb 1 "February 05, 2017" "tomb" .SH NAME Tomb \- the Crypto Undertaker @@ -111,9 +111,9 @@ the tomb is in use by running processes (to force close, see .IP "slam" Closes a tomb like the command \fIclose\fR does, but it doesn't fail even if the tomb is in use by other application processes: it looks -for and violently kills \-9 each of them. This command may +for and closes each of them (in order: TERM, HUP, KILL). This command may provoke unsaved data loss, but assists users to face surprise -situations. +situations. It requires \fIlsof\fR else it falls back to \fIclose\fR. .B diff --git a/doc/tomb_manpage.pdf b/doc/tomb_manpage.pdf index 55aa72d6ab369a54d336d7be9a1ae3beafd0a75d..d2bcad2763d5b3ec03bb2264117c6969154c4bcf 100644 GIT binary patch literal 30887 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 R69R+AAR!_m8b+Fs{|A0K)FA)> literal 21750 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 d^xXeB#doo(E~}uZWHMmHaxLZU+q2K-%D/dev/null 2>/dev/null && WIPE=(wipe -f -s) + # Check for lsof for slamming tombs + command -v lsof -h 1>/dev/null 2>/dev/null || LSOF=0 # Check for steghide command -v steghide 1>/dev/null 2>/dev/null || STEGHIDE=0 # Check for resize @@ -2730,7 +2732,12 @@ main() { # Close the tomb # `slam` is used to force closing. umount|close|slam) - [[ "$subcommand" == "slam" ]] && SLAM=1 + [[ "$subcommand" == "slam" ]] && { + SLAM=1 + [[ $LSOF == 0 ]] && { + unset SLAM + _warning "lsof not installed: cannot slam tombs." + _warning "Trying a regular close." }} umount_tomb $PARAM[1] ;; From e69795fe71e2d3541a493b77d295152ba297aed2 Mon Sep 17 00:00:00 2001 From: Narrat Date: Tue, 7 Feb 2017 03:30:25 +0100 Subject: [PATCH 3/6] lsof should be correctly detected now LSOF would be set everytime otherwise --- tomb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tomb b/tomb index e198fc6..cd286b1 100755 --- a/tomb +++ b/tomb @@ -810,7 +810,7 @@ _ensure_dependencies() { command -v wipe 1>/dev/null 2>/dev/null && WIPE=(wipe -f -s) # Check for lsof for slamming tombs - command -v lsof -h 1>/dev/null 2>/dev/null || LSOF=0 + command -v lsof 1>/dev/null 2>/dev/null || LSOF=0 # Check for steghide command -v steghide 1>/dev/null 2>/dev/null || STEGHIDE=0 # Check for resize From f4cdc1a0c5adfe7ef05cc26bc8ddd5268cdc5b55 Mon Sep 17 00:00:00 2001 From: Arusekk Date: Sun, 5 Feb 2017 20:29:22 +0100 Subject: [PATCH 4/6] Fixed spaces handling in Tomb --- tomb | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tomb b/tomb index 1a1a632..ca9a82a 100755 --- a/tomb +++ b/tomb @@ -242,9 +242,9 @@ _plot() { TOMBFILE=$(basename $TOMBPATH) - # The tomb name is TOMBFILE without an extension. - # It can start with dots: ..foo.tomb -> ..foo - TOMBNAME="${TOMBFILE%\.[^\.]*}" + # The tomb name is TOMBFILE without an extension and underscores instead of spaces (for mount and cryptsetup) + # It can start with dots: ..foo bar baz.tomb -> ..foo_bar_baz + TOMBNAME=${${TOMBFILE// /_}%.*} [[ -z $TOMBNAME ]] && { _failure "Tomb won't work without a TOMBNAME." } @@ -1069,7 +1069,7 @@ ask_key_password() { # call cryptsetup with arguments using the currently known secret # echo flags eliminate newline and disable escape (BSD_ECHO) _cryptsetup() { - print -R -n - "$TOMBSECRET" | _sudo cryptsetup --key-file - ${=@} + print -R -n - "$TOMBSECRET" | _sudo cryptsetup --key-file - ${@} return $? } @@ -2304,7 +2304,7 @@ search_tombs() { # Use swish-e to search over contents [[ $SWISH == 1 && -r $tombmount/.swish ]] && { _message "Searching contents in tomb ::1 tomb name::" $tombname - swish-e -w ${=@} -f $tombmount/.swish -H0 } + swish-e -w ${@} -f $tombmount/.swish -H0 } } || { _warning "Skipping tomb ::1 tomb name::: not indexed." $tombname _warning "Run 'tomb index' to create indexes." } @@ -2709,22 +2709,22 @@ main() { # CREATE Step 1: dig -s NN file.tomb dig) - dig_tomb ${=PARAM} + dig_tomb $PARAM ;; # CREATE Step 2: forge file.tomb.key forge) - forge_key ${=PARAM} + forge_key $PARAM ;; # CREATE Step 2: lock -k file.tomb.key file.tomb lock) - lock_tomb_with_key ${=PARAM} + lock_tomb_with_key $PARAM ;; # Open the tomb mount|open) - mount_tomb ${=PARAM} + mount_tomb $PARAM ;; # Close the tomb @@ -2755,7 +2755,7 @@ main() { # Search tomb contents search) - search_tombs ${=PARAM} + search_tombs $PARAM ;; ## Locking operations @@ -2764,7 +2764,7 @@ main() { engrave) [[ $QRENCODE == 0 ]] && { _failure "QREncode not installed: cannot engrave keys on paper." } - engrave_key ${=PARAM} + engrave_key $PARAM ;; # Change password on existing key @@ -2774,7 +2774,7 @@ main() { # Change tomb key setkey) - change_tomb_key ${=PARAM} + change_tomb_key $PARAM ;; # STEGANOGRAPHY: hide key inside an image From f4f8c4e024218d47cfee1a8467c53d7ce54b4acc Mon Sep 17 00:00:00 2001 From: Amin Mesbah Date: Sun, 12 Feb 2017 16:29:20 -0800 Subject: [PATCH 5/6] Add failing test for opening read-only tomb. Adds a test function called test-open-read-only(). The test prepares a tomb file, removes the "write" permissions from it, and then attempts to open it with "read-only" mount options (`-o ro,noatime,nodev`). The test currently fails as expected. --- extras/test/runtests | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/extras/test/runtests b/extras/test/runtests index b664e9a..4c99a0e 100755 --- a/extras/test/runtests +++ b/extras/test/runtests @@ -56,7 +56,7 @@ command -v qrencode > /dev/null || QRENCODE=0 typeset -A results -tests=(dig forge lock badpass open close passwd chksum bind setkey) +tests=(dig forge lock badpass open close openro passwd chksum bind setkey) { test $RESIZER = 1 } && { tests+=(resize) } { test $KDF = 1 } && { tests+=(kdforge kdfpass kdflock kdfopen) } { test $STEGHIDE = 1 } && { tests+=(stgin stgout stgopen stgpipe stgimpl) } @@ -194,7 +194,32 @@ test-regression() { } +test-open-read-only() { + notice "wiping all testro.tomb* in /tmp" + sudo rm -f /tmp/testro.tomb{,.key,.new.key} + + # Create new + tt dig -s 20 /tmp/testro.tomb + tt forge /tmp/testro.tomb.key \ + --ignore-swap --unsafe --tomb-pwd ${dummypass} --use-urandom + tt lock /tmp/testro.tomb -k /tmp/testro.tomb.key \ + --ignore-swap --unsafe --tomb-pwd ${dummypass} + + notice "Testing open read only" + + # Remove write privilege on test.tomb + chmod -w /tmp/testro.tomb + + # Attempt to open the unwritable tomb with the read-only mount option + tt open /tmp/testro.tomb -k /tmp/testro.tomb.key \ + --ignore-swap --unsafe --tomb-pwd ${dummypass} -o ro,noatime,nodev + + { test $? = 0 } && { + results+=(openro SUCCESS) + tt close testro + } +} startloops=(`sudo losetup -a |cut -d: -f1`) @@ -227,8 +252,8 @@ tt close test { test $? = 0 } && { results+=(close SUCCESS) } - - +# isolated function +test-open-read-only notice "Testing changing tomb password" From 70334f58fb254f430d744f94e13db0e3bc656268 Mon Sep 17 00:00:00 2001 From: Amin Mesbah Date: Sun, 12 Feb 2017 17:27:40 -0800 Subject: [PATCH 6/6] Skip writable check when mounting with "ro" option. When opening a tomb file with "ro" passed through the -o option, the writability check in is-valid-tomb() is skipped. This allows tomb files to be opened without write permission. test-open-read-only() now succeeds. --- tomb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tomb b/tomb index cd286b1..71352c6 100755 --- a/tomb +++ b/tomb @@ -507,7 +507,8 @@ is_valid_tomb() { _fail=0 # Tomb file must be a readable, writable, non-empty regular file. - [[ ! -w "$1" ]] && { + # If passed the "ro" mount option, the writable check is skipped. + [[ ! -w "$1" ]] && [[ $(option_value -o) != *"ro"* ]] && { _warning "Tomb file is not writable: ::1 tomb file::" $1 _fail=1 }