I recently posted about how to create a sandboxed firefox profile to compartmentalize (and shred) your firefox browsing history in an Ephemeral Firefox session. But so far I’ve only covered how to create a simple vanilla firefox profile. What if you want your Ephemeral Firefox to include a few basic extensions?
This post will cover how to add extensions to your Ephemeral Firefox profile.
- Part 1/3: Ephemeral Firefox in Ubuntu
- Part 2/3: Ephemeral Firefox with Extensions
- Part 3/3: Ephemeral Firefox as a Site-Specific Browser
Prereqs
Before proceeding, you must first execute the following prerequsites, which are detailed in my first post on setting up an Ephemeral Firefox.
sudo apt-get -y install firejail secure-delete sudo firecfg --clean
Create Skeleton Directory
Because we build the Ephemeral Firefox profile directory on-the-fly, we need to build a base skeleton directory with the extensions we want and a few configuration files.
The commands below will create the skeleton directory, download a few basic extensions, rename them as needed for installation, and change the config to allow for automatic installation of extensions.
SKEL_PATH="$HOME/.mozilla/firefox/ephemeralFirefoxSkel"
# create skeleton directory for extensions, if necessary
[ ! -d "${SKEL_PATH}/extensions" ] && mkdir -p "${SKEL_PATH}/extensions"
# the name of the extensions found in this list must match the unique "slug" id
# of the extension as found in the URL. For example:
# * https://addons.mozilla.org/en-US/firefox/addon/https-everywhere/
extensions="https-everywhere ublock-origin cookie-autodelete privacy-badger17 chameleon-ext decentraleyes"
# for every extension, download it and rename it. For more info, see:
# * https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Distribution_options/Sideloading_add-ons
cd "${SKEL_PATH}/extensions"
for slug in $extensions; do
# download the file
downloadFileName="addon-${slug}-latest.xpi"
wget "https://addons.mozilla.org/firefox/downloads/latest/${slug}/${downloadFileName}"
# rename the file; the required new name is found in the manifest.json file
unzip -o "${downloadFileName}" manifest.json
newFileName="`cat manifest.json | python -c "import sys, json; print json.load(sys.stdin)['applications']['gecko']['id']"`.xpi"
rm manifest.json
mv "${downloadFileName}" "${newFileName}"
done
# allow extensions to be installed without human confirmation for faster startup
cat > "${SKEL_PATH}/user.js" <<'EOF'
user_pref("extensions.autoDisableScopes", 0);
EOF
Create Ephemeral Firefox Script
Copy the following script into '$HOME/bin/ephemeralFirefox.sh', make it executable, and make sure '$HOME/bin' is in your $PATH
[ ! -d $HOME/bin/ ] && mkdir $HOME/bin
cat > $HOME/bin/ephemeralFirefox.sh <<'EOF'
#!/bin/bash
################################################################################
# Author: Michael Altfield <michael@michaelaltfield.net>
# Created: 2019-03-03
# Updated: 2019-03-06
# Version: 0.2
# Purpose: Start an Ephemeral Firefox session with basic extensions
################################################################################
############
# SETTINGS #
############
TMP_PATH="$HOME/tmp/ephemeralFirefox"
SKEL_PATH="$HOME/.mozilla/firefox/ephemeralFirefoxSkel"
###############################
# CLEANUP OLD ORPHAN TMP DATA #
###############################
# loop through all the Ephemeral Firefox temp dirs
for tmpDir in $(find "${TMP_PATH}" -mindepth 1 -maxdepth 1 -type d); do
# is this temp dir for an Ephemeral Firefox that's still running? Or is it no longer needed?
if [[ -z `firejail --list | grep "${tmpDir}"` ]]; then
# this temp dir is no longer needed; delete it
echo "INFO: shredding data from old Ephemeral Firefox temp dir = ${tmpDir}"
srm -rfll "${tmpDir}"
fi
done
###################
# CREATE TEMP DIR #
###################
# first create a temp dir in our (hopefully encrypted) $HOME dir, if first run
[ ! -d "${TMP_PATH}" ] && mkdir -p "${TMP_PATH}"
# create temp dir for ephemeral session
tmpDir=`/bin/mktemp -p "$TMP_PATH" -d`
tmpProfileDir="${tmpDir}/firefoxProfile"
mkdir -p "${tmpProfileDir}"
echo "INFO: created Ephemeral Firefox temp profile dir = ${tmpProfileDir}"
###########################
# START EPHEMERAL FIREFOX #
###########################
# what should the homepage be?
url="${1}"
if [[ -z ${url} ]]; then
url="https://start.duckduckgo.com"
fi
# prepare extensions
cp -r "${SKEL_PATH}/extensions" "${tmpProfileDir}/extensions"
cp -r "${SKEL_PATH}/browser-extension-data" ${tmpProfileDir}/
cp "${SKEL_PATH}/user.js" "${tmpProfileDir}/"
cp "${SKEL_PATH}/extensions.json" "${tmpProfileDir}/"
# try disabling 'seccomp' if you encounter issues
#firejail --ignore=seccomp --whitelist="${tmpProfileDir}" firefox -no-remote -new-instance -profile "${tmpProfileDir}" "${url}"
firejail --whitelist="${tmpProfileDir}" firefox -no-remote -new-instance -profile "${tmpProfileDir}" "${url}"
###########
# CLEANUP #
###########
# fast (secure enough) wipe of tmp dir
srm -vrfll "${tmpDir}"
# clean exit
exit 0
EOF
chmod +x $HOME/bin/ephemeralFirefox.sh
PATH=$PATH:$HOME/bin
First Run Bootstrap
At this point you should be able to run `ephemeralFirefox.sh` in your shell, and it you’ll get a Ephemeral Firefox session with all your extensions installed. But [a] your extensions won’t be configured and [b] firefox will probably annoyingly start with a tab for each of the plugins’ latest release notes.
We can clean this up a bit by copying a few items from the first run’s temporary profile directory and permanently storing it to the skeleton directory created above like so:
First, delete any orphaned temp profile dirs that may be lingering around. Then kick-off the first-run Ephemeral Firefox.
srm -vrfll $HOME/tmp/ephemeralFirefox/* ephemeralFirefox.sh ...
Then, in another terminal, copy the following items from the first-run Ephemeral Firefox’s profile dir into the skeleton dir:
cp -r $HOME/tmp/ephemeralFirefox/tmp.*/firefoxProfile/browser-extension-data $HOME/.mozilla/firefox/ephemeralFirefoxSkel/ cp $HOME/tmp/ephemeralFirefox/tmp.*/firefoxProfile/extensions.json $HOME/.mozilla/firefox/ephemeralFirefoxSkel/
Now close the first-run Epheremal Firefox, and start a new one
user@host:~$ ephemeralFirefox.sh ...
Congratulations! Your Ephemeral Firefox session will now start with your basic extensions and user.js config.
Further Reading
This articles is part 2 of a 3-part series on Ephemeral Firefox. The other parts can be found here:
- Part 1/3: Ephemeral Firefox in Ubuntu
- Part 2/3: Ephemeral Firefox with Extensions
- Part 3/3: Ephemeral Firefox as a Site-Specific Browser
Related Posts
Hi, I’m Michael Altfield. I write articles about opsec, privacy, and devops ➡











> TMP_PATH=”$HOME/tmp/ephemeralFirefox”
I tried to change this directory to /dev/shm and it doesn’t work 🙁 , I receive this error.
Child process initialized in 70.95 ms
libGL error: MESA-LOADER: failed to retrieve device information
libGL error: MESA-LOADER: failed to open amdgpu (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri)
libGL error: failed to load driver: amdgpu
libGL error: failed to open drm device: No such file or directory
libGL error: failed to load driver: radeonsi
ExceptionHandler::GenerateDump cloned child 27
ExceptionHandler::SendContinueSignalToChild sent continue signal to child
ExceptionHandler::WaitForContinueSignal waiting for continue signal…
Gtk-Message: 20:30:10.157: GtkDialog mapped without a transient parent. This is discouraged.
@Max see my reply to your comment here
Please do let me know if you get tmpfs working with this Ephemeral Firefox script 🙂