Whonix live mode / amnesia / amnesic / non-persistent / anti-forensics

Certainly not impossible, but would at least require an initramfs hook. However, I’d stick to what it is in there by default. Every other script in there also uses those programs.

I can do that. We need another name anyway. ro-mode-init would give a nice abbreviation, romi.

You could maybe use a fallback option for systemd-detect-virt in case it does not detect a hypervisor to automatically assume bare metal. Or you get rid of it at all. You could always parse the underlying stuff directly from /proc or /sys which more or less each virtualization detection tool does and virt-what even suggests in the man page. More recent versions of the kernel can see very early in the boot process if the disk is write protected which could maye also be used instead. It is under /sys/block/vda/ro or similar path depending on the disk driver.
I can try to contact upstream, though in its current form it is using some rather hacky workarounds to actually not need to change the upstream packages :wink: and is basically an end-user friendly version of adding “plainroot …” to the boot options. It makes some assumptions which are rather Whonix-specific and always relies on user interaction on the host to work as intended.

2 Likes

Algernon:

Certainly not impossible, but would at least require an initramfs hook. However, I’d stick to what it is in there by default. Every other script in there also uses those programs.

Ok.

You could maybe use a fallback option for systemd-detect-virt in case it does not detect a hypervisor to automatically assume bare metal.

Ok. But how would you figure out the root disk? Read it from kernel options?

Or you get rid of it at all

How? Read it from kernel options? Why do we have to detect it by detecting the virtualizer anyhow? How would the system figure it out by itself later on? Can we use the same mechanism?

You could always parse the underlying stuff directly from /proc or /sys which more or less each virtualization detection tool does and virt-what even suggests in the man page.

Sure.

More recent versions of the kernel can see very early in the boot process if the disk is write protected which could maye also be used instead. It is under /sys/block/vda/ro or similar path depending on the disk driver.

I like that much more than mounting and parsing /proc/mounts. Seems the much more appropriate way than custom parsing code.

I can try to contact upstream,

Yes, please! I am curious what they say. They might have some good comments.

Yes.

I think the system uses whatever it sees defined as “root=” on the kernel commandline. If you make sure that the first disk is always the root disk with Whonix on it that you want to boot then this should also work. A non standard disk setup is probably an edge case. I’m going to test it in combination with /sys/block/*da/ro.

2 Likes

New script with check by the kernel if the disk is ro or rw. Works on KVM and VirtualBox.

#!/bin/sh

set -e

case "${1}" in
        prereqs)
                exit 0
                ;;
esac

output() {
   echo "live boot test: $@"
}

ro_test() {
   output "Testing for live boot."
   
   root_uuid=$(echo $ROOT | sed 's/.*=//')
   root_disk=$(blkid -U $root_uuid | sed 's/1//' | sed 's#/dev/##')
   ro_check=$(cat /sys/block/$root_disk/ro)

   if [ "$ro_check" = "0" ]; then
      output "Read-write disk detected. Assuming persistent mode."
      read_write=true
   elif [ "$ro_check" = "1" ]; then
      output "Read-only disk detected. Assuming live mode."
      read_write=false
   else
      output "Write mode detection failed."
      read_write=error
   fi
}


live_boot() {
   echo "root_uuid=$root_uuid" >> /scripts/local
   echo "BOOT=live" >> /scripts/local
   echo 'LIVE_BOOT_CMDLINE="root=/dev/disk/by-uuid/$root_uuid boot=live ip=frommedia plainroot union=overlay"' >> /scripts/local
   exit 0
}

true "Setting fallback read_write=error."
read_write=error

ro_test

if [ "$read_write" = "error" ]; then
   output "Contents of /sys/block/<disk>/ro:"
   cat /sys/block/$root_disk/ro
   ## TODO: Should we exit 0 here or is non-zero more appropriate?
   exit 0
fi

if [ "$read_write" = "false" ]; then
   live_boot
fi

output "Proceeding persistent boot."

exit 0
1 Like

Looks much better! (Although still untested by me but I trust you test and this will work. I would upload package containing this and then let users install it since the code is easily reviewed to be non-malicious so this can be opened up for wide testing.)

Remaining nitpicks:

  • set -x’ if some debug (grub) kernel boot parameter is set
  • when if [ "$read_write" = "error" ]; then matches we should still output output "Proceeding persistent boot."?
  • in live_boot before the exit 0 please add output "Proceeding live boot."?
  • Please use shellcheck. It has some false positives but adding the double quotes for the variables should be applied.
1 Like

https://phabricator.whonix.org/T714#16398

1 Like

Uploaded to all stretch repositories.

1 Like

persistent / love mode indicator systray - graphical indication on the desktop that system is running in live mode vs persistent mode
https://phabricator.whonix.org/T819

i am looking forward to playing with grub live mode. this may allow me to remove all the “immutible” configuration steps from the guide i work on. excellent work everyone.

Regarding https://github.com/Whonix/anon-meta-packages/pull/7
Meta package whonix-gateway-rpi… Nice. Why reference a lot of these packages individually such as console-setup? Can’t that be mostly meta packages for the most part?

I guess sdwdate-gui should not be a dependency of anon-shared-packages-dependencies. That can be considered a bug. Let’s move it to anon-shared-packages-recommended? Does that help?

I mean, if we have bugs there, I much rather do the short-term more effort proper bug fix way.

Live Mode for Kicksecure is too confusing. First users can pick:

Then for VirtualBox users can pick:

ro-mode-init method must be combined with read-only Method, otherwise:

it will always boot into persistent mode.

Too many combinations. Not all combinations are safe. Murphy’s law dictates that something will go wrong.

I guess the user only knows what platform they are using VirtualBox vs KVM and then likes to see one coherent block of instructions that has a safe result.

Maybe I am just confused by “For this option the VM disk needs to be set to read-only, otherwise it will always boot into persistent mode.” because you mean both read-only Method and Immutable Disk Method satisfy “needs to be set to read-only”?

Imho, the recommended way would be to use read-only disks combined with ro-mode-init. This would be most secure and would set up live mode automatically. The problem is when a user forgets to set the disks to read only, in this case it would automatically boot into persistent mode. The other options, however, also require some kind of user interaction.

2 Likes

Live Mode for Kicksecure ™ - Kicksecure made great progress! However, it shouldn’t list alternative methods actual steps. In my experience this mostly confuses users.

Also Follow the procedures above depending on your hypervisor is hard to follow for users including myself. Usability is about reducing complexity and mental workload. “Consciousness is a low RAM environment.”

Therefore split now:

That allowed to replace the mouthful

Recommended VirtualBox Configuration with a more standarized, easier VirtualBox.

Could you please make the following instructions standalone, i.e. not having these require to apply steps from * Live Mode for Kicksecure ™ - Kicksecure?

Perhaps by putting the shared bits of instructions into wiki templates?

Added advantage, if we had wiki templates we could even add this to Whonix ™ for Windows, macOS, Linux inside VirtualBox and/or Whonix ™ for KVM or so.

I consider all of above details. After my today’s edits Live Mode for Kicksecure ™ - Kicksecure is now ready for wider publication since instruction are non-ambiguous, straight forward.

Thanks, also to the other editors like @torjunkie and @0brand. It is always a difference when someone else who did not already test the setup dozens of times and where everything seems to be logic and straightforward, takes a look. I’m going to add the respective instructions to the two other wiki pages. Where can I read more about wiki templates?

3 Likes

A post was split to a new topic: How to use Wiki Templates?


Should this change VM Live Mode: Difference between revisions - Whonix be approved?

1 Like

Minor fix. Also has to be changed for VM Live Mode: Alternative ro-mode-init Configuration but I only see it once in the editor? Template?
Also " The procedure of installing … now complete." → " The procedure of installing … is now complete."

1 Like

I suppose

VBoxManage setextradata vmname “VBoxInternal/Devices/lsilogicsas/0/LUN#0/AttachedDriver/Config/Readonly” 1

Is correct.

ReadOnly

Not required.

(Otherwise please make the edit.)

I was also wondering about…

VBoxManage setextradata vmname “VBoxInternal/Devices/lsilogicsas/0/LUN#0/AttachedDriver/Config/Readonly”

Would it work adding a 0 at the end? Like…

VBoxManage setextradata vmname “VBoxInternal/Devices/lsilogicsas/0/LUN#0/AttachedDriver/Config/Readonly” 0

That would look a bit more consistent in the wiki.


At the bottom of that page you can see Templates used on this page:.

In this case:

Fixed.