mirror of https://github.com/CIRCL/Circlean
				
				
				
			
						commit
						4e5b7b2815
					
				
							
								
								
									
										26
									
								
								CHANGELOG
								
								
								
								
							
							
						
						
									
										26
									
								
								CHANGELOG
								
								
								
								
							|  | @ -1,26 +0,0 @@ | |||
| Version 1.2 - 2015-03-10 | ||||
| 
 | ||||
| - Rollback the migration to Jessie and use Wheezy again: the only important dependency from Jessie was poppler, which is available in the backports | ||||
| - Use the most recent security patches | ||||
| - Do not wait for user input in case of password protected archive | ||||
| 
 | ||||
| Version 1.1.1 - 2014-10-26 | ||||
| 
 | ||||
| - General upgrade of Debian to avoid the system to fail in case there is no HDMI cable connected. | ||||
| 
 | ||||
| Version 1.1 - 2014-10-01 | ||||
| 
 | ||||
| - NTFS support added for USB key | ||||
| - Updated to Debian Jessie including patches for [bash vulnerabilities CVE-2014-6271 - CVE-2014-7169](/pub/tr-27/) | ||||
| - CIRCLean user are now removed from the sudoer | ||||
| 
 | ||||
| Version 1.0 - 2014-05-20 | ||||
| 
 | ||||
| - Based on Raspbian Jessie | ||||
| - Fully automated tests with Qemu | ||||
| - Mimetype: support of PDF, Office documents, archives, windows executables | ||||
| - Filesystem: USB keys have to be formated in vfat | ||||
| - Support of multiple partitions | ||||
| - Renaming of autorun.inf on the source key | ||||
| - Operating system is read only | ||||
| - Use pdf2htmlEX v0.11 | ||||
|  | @ -0,0 +1,50 @@ | |||
| Version 2.1 - 2017-02-02 | ||||
| - Updated to the newest version of Raspbian Jessie lite (January 11th 2017 release) | ||||
| - NTFS files can now be mounted as source or destination keys | ||||
| - Added udev rules that ensure the USB ports map deterministically to source and destination keys | ||||
| - New debug flag and debug logging functionality to make working on Circlean without a monitor easier | ||||
| - Turned off automatic display sleep | ||||
| 
 | ||||
| Version 2.0.2 - 2016-05-12 | ||||
| - Improve filename encoding | ||||
| 
 | ||||
| Version 2.0.1 - 2016-04-26 | ||||
| - Re-add [timidity](http://timidity.sourceforge.net/) so the MIDI files are played properly | ||||
| 
 | ||||
| Version 2.0 - 2016-04-26 | ||||
| - No critical bugs have been identified, this release uses the latest version of Raspbian Jessie lite, with all system updates | ||||
| 
 | ||||
| Version 2.0-BETA - 2015-11-06 | ||||
| - There a new beta version of CIRCLean which is a significant improvement from the latest version in term of speed and efficiency on low-end hardware like the first version of the Raspberry Pi. The new code base of CIRCLean is now based on [PyCIRCLean](https://github.com/CIRCL/PyCIRCLean) | ||||
| 
 | ||||
| Version 1.3 - 2015-05-27 | ||||
| - Fix a [critical security bug](https://www.circl.lu/projects/CIRCLean/security/advisory-01) related to [polyglot files](https://github.com/CIRCL/Circlean/issues/9) - thanks to the reporters ([Jann Horn](https://github.com/thejh), [seclab-solutions](http://www.seclab-solutions.com/)) | ||||
| - Use [PyCIRCLean](https://github.com/CIRCL/PyCIRCLean) for conversion | ||||
| - Convert PDF files to PDF/A before converting to HTML | ||||
| 
 | ||||
| Version 1.2 - 2015-03-10 | ||||
| 
 | ||||
| - Rollback the migration to Jessie and use Wheezy again: the only important dependency from Jessie was poppler, which is available in the backports | ||||
| - Use the most recent security patches | ||||
| - Do not wait for user input in case of password protected archive | ||||
| 
 | ||||
| Version 1.1.1 - 2014-10-26 | ||||
| 
 | ||||
| - General upgrade of Debian to avoid the system to fail in case there is no HDMI cable connected. | ||||
| 
 | ||||
| Version 1.1 - 2014-10-01 | ||||
| 
 | ||||
| - NTFS support added for USB key | ||||
| - Updated to Debian Jessie including patches for [bash vulnerabilities CVE-2014-6271 - CVE-2014-7169](/pub/tr-27/) | ||||
| - CIRCLean user are now removed from the sudoer | ||||
| 
 | ||||
| Version 1.0 - 2014-05-20 | ||||
| 
 | ||||
| - Based on Raspbian Jessie | ||||
| - Fully automated tests with Qemu | ||||
| - Mimetype: support of PDF, Office documents, archives, windows executables | ||||
| - Filesystem: USB keys have to be formated in vfat | ||||
| - Support of multiple partitions | ||||
| - Renaming of autorun.inf on the source key | ||||
| - Operating system is read only | ||||
| - Use pdf2htmlEX v0.11 | ||||
|  | @ -1,17 +1,50 @@ | |||
| Building the project | ||||
| ==================== | ||||
| Getting started | ||||
| =============== | ||||
| 
 | ||||
| To get started contributing to Circlean, first, fork the project and `git clone` | ||||
| your fork. Then, follow the instructions in [README_setup.md](README_setup.md) | ||||
| to build an image. | ||||
| If you'd like to work on the Python code that processes files for Circlean, you should | ||||
| take a look at [PyCIRCLean](https://github.com/CIRCL/PyCIRCLean), specifically the | ||||
| filecheck.py script. To get started contributing to Circlean, first, fork the project and | ||||
| `git clone` your fork. Then, follow the instructions in [setup_with_proot.md](doc/setup_with_proot.md) to build an image. To make things easier, you can also download a | ||||
| prebuilt image as mentioned in the README, and then mount and make modifications to this | ||||
| image to test your changes. | ||||
| 
 | ||||
| The issue tracker | ||||
| ================= | ||||
| 
 | ||||
| If you find a bug or see a problem with PyCIRCLean, please open an issue in the Github | ||||
| repo. We'll do our best to respond as quickly as possible. Also, feel free to contribute a solution | ||||
| to any of the open issues - we'll do our best to review your pull request in a timely manner. | ||||
| This project is in active development, so any contributions are welcome! | ||||
| repo. We'll do our best to respond as quickly as possible. Also, feel free to contribute a | ||||
| solution to any of the open issues - we'll do our best to review your pull request in a | ||||
| timely manner. This project is in active development, so any contributions are welcome! | ||||
| 
 | ||||
| Dependencies | ||||
| ============ | ||||
| * Timidity for playing midi files | ||||
| * Git for installing some Python dependencies | ||||
| * 7Zip for unpacking archives | ||||
| * Pmount and ntfs-3g for mounting usb key partitions | ||||
| * Python 3 and pip for installing and running Python dependencies | ||||
| * Python3-lxml for handling ooxml and other Office files in filecheck.py | ||||
| * libjpeg-dev, libtiff-dev, libwebp-dev, liblcms2-dev, tcl-dev, tk-dev, and python-tk for various image formats (dependencies for pillow) | ||||
| * Exifread for file metadata | ||||
| * Pillow for handling images | ||||
| * Olefile, oletools, and officedissector for handling various Office filetypes | ||||
| * PyCIRCLean for main file handling code | ||||
| 
 | ||||
| Helper scripts | ||||
| ============== | ||||
| 
 | ||||
| Use the scripts in shell_utils/ as examples - do not run them blindly as you will most | ||||
| probably have to change some constants/paths accordingly to your configuration. | ||||
| 
 | ||||
| IN ALL CASES, PLEASE READ THE COMMENTS IN THE SCRIPTS AT LEAST ONCE. | ||||
| 
 | ||||
| * proper_chroot.sh: uses qemu to chroot into a raspbian instance (.img or SD Card) | ||||
| * prepare_rPI.sh: update the system, some configuration | ||||
| * create_user.sh: create the user who will run the scripts, assign the proper sudo rights. | ||||
| * copy_to_final.sh: populate the content of the directory fs/ in the image, | ||||
|     contains a sample of dd command to write the image on the SD card. | ||||
|     NOTE: TAKE CARE NOT TO USE THE WRONG DESTINATION | ||||
| 
 | ||||
| 
 | ||||
| Running the tests | ||||
| ================= | ||||
|  |  | |||
							
								
								
									
										46
									
								
								README.md
								
								
								
								
							
							
						
						
									
										46
									
								
								README.md
								
								
								
								
							|  | @ -3,17 +3,19 @@ CIRCLean | |||
|  | ||||
|  | ||||
| 
 | ||||
| How To | ||||
| ====== | ||||
| How To Install | ||||
| ============== | ||||
| 
 | ||||
| [Graphical how-to and pre-built image](http://circl.lu/projects/CIRCLean/). | ||||
| [Graphical how-to and pre-built image download](http://circl.lu/projects/CIRCLean/). | ||||
| 
 | ||||
| To prepare the SD card on Windows, you can use [Win32DiskImager](http://sourceforge.net/projects/win32diskimager/). | ||||
| To prepare the SD card on Windows, you can use [Win32DiskImager](http://sourceforge.net/projects/win32diskimager/). On linux/macOS, use dd (see the how-to link for | ||||
| instructions). | ||||
| 
 | ||||
| And the linux way is in the command line, via dd (see in copy_to_final.sh) | ||||
| The current prebuilt image is based on the 1-11-17 release of Raspbian Jessie Lite. | ||||
| The smallest SD card that Circlean can fit on is currently 4GB. | ||||
| 
 | ||||
| If you'd like to contribute to the project or build the image yourself, see | ||||
| [contributing](CONTRIBUTING.md) and the [setup readme](README_setup.md). | ||||
| [contributing.md](CONTRIBUTING.md) and the [setup instructions](doc/setup_with_proot.md). | ||||
| This is a work in progress - contributions are welcome. | ||||
| 
 | ||||
| Why/What | ||||
|  | @ -21,21 +23,25 @@ Why/What | |||
| 
 | ||||
| This project aims to be useful when you get/find a USB key that you can't trust, | ||||
| and you want to look at its contents without taking the risk of plugging it into | ||||
| your computer directly. | ||||
| your computer directly. The official project page can be found at [https://www.circl.lu/projects/CIRCLean/] | ||||
| 
 | ||||
| The Raspberry Pi Foundation has a [blog post](https://www.raspberrypi.org/blog/kittengroomercirclean-data-security-for-journalists-and-activists/) with more information | ||||
| about an older version of the project and details of the inspiration behind it. | ||||
| 
 | ||||
| CIRCLean is currently tested to work with USB keys that have FAT32, NTFS, or | ||||
| ext2/3/4 filesystems. Currently, exFAT is not supported due to lack of support for | ||||
| this format in pmount. The vast majority of USB keys will be FAT32 or NTFS. | ||||
| ext2/3/4 filesystems (ext* filesystems can only be used as source keys, not destination | ||||
| keys). Currently, exFAT is not supported due to lack of support for this format in pmount. | ||||
| The vast majority of USB keys will be FAT32 or NTFS. | ||||
| 
 | ||||
| The content of the untrusted key will be copied or/and converted to the second | ||||
| (blank) key following these rules (based on the mime type as determined bylibmagic): | ||||
| (blank) key following these rules (based on the mime type as determined by libmagic): | ||||
| - Direct copy of: | ||||
|   - Plain text files (mime type: text/*) | ||||
|   - Audio files (mime type: audio/*) | ||||
|   - Video files (mime type: video/*) | ||||
|   - Example files (mime type: example/*) | ||||
|   - Multipart files (mime type: multipart/*) | ||||
|   - *xml* files, after being converted to text files | ||||
|   - xml files, after being converted to text files | ||||
|   - Octet-stream files | ||||
| - Copied after verification: | ||||
|   - Image files after verifying that they are not compression bombs (mime type: image/*) | ||||
|  | @ -55,7 +61,7 @@ Usage | |||
| ===== | ||||
| 
 | ||||
| 0. Power off the device and unplug all connections. | ||||
| 1. Plug the untrusted key in the top USB slot of the Raspberry Pi. | ||||
| 1. Plug the untrusted key in the top left USB slot of the Raspberry Pi. | ||||
| 2. Plug your own key in the bottom USB slot (or use any of the other slots if | ||||
| there are more than 2). | ||||
| 
 | ||||
|  | @ -71,19 +77,3 @@ there are more than 2). | |||
|    connected the HDMI cable, check the screen. The process is slow and can take | ||||
|    30-60 minutes depending on how many document conversions take place. | ||||
| 6. Power off the device and disconnect the drives. | ||||
| 
 | ||||
| Helper scripts | ||||
| ============== | ||||
| 
 | ||||
| You should use them as examples when you are creating a new image and probably not | ||||
| run them blindly as you will most probably have to change parameters accordingly to | ||||
| your configuration. | ||||
| 
 | ||||
| IN ALL CASES, PLEASE READ THE COMMENTS IN THE SCRIPTS AT LEAST ONCE. | ||||
| 
 | ||||
| * proper_chroot.sh: uses qemu to chroot into a raspbian instance (.img or SD Card) | ||||
| * prepare_rPI.sh: update the system, some configuration | ||||
| * create_user.sh: create the user who will run the scripts, assign the proper sudo rights. | ||||
| * copy_to_final.sh: populate the content of the directory fs/ in the image, | ||||
|     contains a sample of dd command to write the image on the SD card. | ||||
|     NOTE: TAKE CARE NOT TO USE THE WRONG DESTINATION | ||||
|  |  | |||
							
								
								
									
										196
									
								
								README_setup.md
								
								
								
								
							
							
						
						
									
										196
									
								
								README_setup.md
								
								
								
								
							|  | @ -1,196 +0,0 @@ | |||
| Building the image from scratch | ||||
| =============================== | ||||
| 
 | ||||
| There is always a prebuilt image available for download and installation as | ||||
| described in the [README](README.md). If you'd like to build the project yourself, | ||||
| there are several steps involved: | ||||
| 
 | ||||
| * Downloading a generic Raspbian Lite image | ||||
| * Adding space to the image | ||||
| * Downloading and building the dependencies | ||||
| * Copying the project filesystem into the image | ||||
| 
 | ||||
| This procedure will only work on Ubuntu or Debian Linux. If you use MacOS or | ||||
| Windows, the best option is to install Linux in a virtual machine using | ||||
| something like VirtualBox. | ||||
| 
 | ||||
| Downloading the Raspbian image | ||||
| ============================== | ||||
| 
 | ||||
| * Get the most recent version of Raspbian Jessie Lite: | ||||
| 
 | ||||
| ``` | ||||
|    wget https://downloads.raspberrypi.org/raspbian_lite_latest | ||||
| ``` | ||||
| 
 | ||||
| * Unpack it: | ||||
| 
 | ||||
| ``` | ||||
|     unzip XXXX-XX-XX-raspbian-jessie-lite.zip | ||||
| ``` | ||||
| 
 | ||||
| Adding space to the image | ||||
| ========================= | ||||
| 
 | ||||
| * Use dd to add 2GB (2048 blocks at 1024k each). Using /dev/zero as the input | ||||
| file yields an unlimited number of "0x00" bytes. | ||||
| 
 | ||||
| ``` | ||||
|     > dd if=/dev/zero bs=1024k count=2048 >> XXXX-XX-XX-raspbian-jessie-lite.img | ||||
| ``` | ||||
| 
 | ||||
| * Grow the root partition using fdisk. The "p" command prints the current partition | ||||
| table. The first partition listed is the boot partition, which shouldn't be changed. | ||||
| The "d" command, when given the parameter "2", deletes the current root partition. | ||||
| The "n" command then makes a new partition. It can take the default for "type" | ||||
| and "number". The "First sector" should be the value that was the "start" sector of the root | ||||
| partition (131072 in the example below, but this varies depending on the version of the | ||||
| Raspbian image). The "Last sector" should be the default, and it should be significantly | ||||
| larger than it was before (6852607 vs. 2658303 in the example). | ||||
| 
 | ||||
| 
 | ||||
| ``` | ||||
|     > fdisk XXXX-XX-XX-raspbian-jessie-lite.img | ||||
| 
 | ||||
|     Command (m for help): *p* | ||||
|     Disk XXXX-XX-XX-raspbian-jessie-lite.img: 3.3 GiB, 3508535296 bytes, 6852608 sectors | ||||
|     Units: sectors of 1 * 512 = 512 bytes | ||||
|     Sector size (logical/physical): 512 bytes / 512 bytes | ||||
|     I/O size (minimum/optimal): 512 bytes / 512 bytes | ||||
|     Disklabel type: dos | ||||
|     Disk identifier: 0x6f92008e | ||||
| 
 | ||||
|     Device                               Boot  Start     End Sectors  Size Id Type | ||||
|     XXXX-XX-XX-raspbian-jessie-lite.img1        8192  131071  122880   60M  c W95 FAT32 (LBA) | ||||
|     XXXX-XX-XX-raspbian-jessie-lite.img2      131072 2658303 2527232  1.2G 83 Linux | ||||
| 
 | ||||
|     Command (m for help): *d* | ||||
|     Partition number (1,2, default 2): *2* | ||||
| 
 | ||||
|     Partition 2 has been deleted. | ||||
| 
 | ||||
|     Command (m for help): *n* | ||||
|     Partition type | ||||
|        p   primary (1 primary, 0 extended, 3 free) | ||||
|        e   extended (container for logical partitions) | ||||
|     Select (default p): | ||||
| 
 | ||||
|     Using default response p. | ||||
|     Partition number (2-4, default 2): | ||||
|     First sector (2048-6852607, default 2048): *131072* | ||||
|     Last sector, +sectors or +size{K,M,G,T,P} (131072-6852607, default 6852607): | ||||
| 
 | ||||
|     Created a new partition 2 of type 'Linux' and of size 3.2 GiB. | ||||
| 
 | ||||
|     Command (m for help): *w* | ||||
|     The partition table has been altered. | ||||
|     Syncing disks. | ||||
| ``` | ||||
| 
 | ||||
| * Mount the image in loop mode: first, edit /mount_image.sh to use the proper values | ||||
| for $OFFSET_BOOT and $OFFSET_ROOTFS, which you can obtain using fdisk and "p" as | ||||
| shown above. You must also change $IMAGE to the correct path. Then run: | ||||
| 
 | ||||
| ``` | ||||
|     sudo ./proper_chroot.sh | ||||
| ``` | ||||
| 
 | ||||
| * After mounting the image, the above script will chroot into the mounted image. | ||||
| While in a chroot, the / directory of the image appears as the system / directory | ||||
| (thus the name, change root). To exit the chroot, run "exit" in the root directory. | ||||
| Then, verify the path to the mounted partitions, and resize the filesystem | ||||
| to fill the new larger partition using resize2fs: | ||||
| 
 | ||||
| ``` | ||||
|     > df | grep /mnt/arm | ||||
| 
 | ||||
|     /dev/loop0                3927752   1955672   1794172  53% /mnt/arm_rPi | ||||
|     /dev/loop1                  57288     18960     38328  34% /mnt/arm_rPi/boot | ||||
| 
 | ||||
|     > sudo resize2fs /dev/loop0 | ||||
| ``` | ||||
| 
 | ||||
| Installing the dependencies | ||||
| =========================== | ||||
| 
 | ||||
| * To install the dependencies, you'll have to reenter the chroot again: | ||||
| 
 | ||||
| ``` | ||||
|     sudo chroot /mnt/arm_rPi | ||||
| ``` | ||||
| 
 | ||||
| * Change your user to root (your global variables may be broken as a result): | ||||
| 
 | ||||
| ``` | ||||
|     su root | ||||
| ``` | ||||
| 
 | ||||
| * Change the locales (remove "en_GB.UTF-8 UTF-8", add "en_US.UTF-8 UTF-8"). The | ||||
| arrow keys move the cursor, spacebar selects/deselects a locale, tab moves the cursor | ||||
| to a different context, and enter lets you select "ok": | ||||
| 
 | ||||
| ``` | ||||
|     dpkg-reconfigure locales | ||||
| ``` | ||||
| 
 | ||||
| * In the image, make sure everything is up-to-date and remove the old packages: | ||||
| 
 | ||||
| ``` | ||||
|     apt-get update | ||||
|     apt-get dist-upgrade | ||||
|     apt-get autoremove | ||||
|     apt-get install timidity git p7zip-full python-dev python-pip python-lxml pmount libjpeg-dev libtiff-dev libwebp-dev liblcms2-dev tcl-dev tk-dev python-tk libxml2-dev libxslt1-dev | ||||
| ``` | ||||
| 
 | ||||
| * Install the Python dependencies for PyCIRCLean. Currently, PyCIRCLean is | ||||
| Python 2.7 and 3.3+ compatible, but Python 2 support might be dropped at some point. | ||||
| 
 | ||||
| ``` | ||||
|     pip install oletools olefile exifread Pillow | ||||
|     pip install git+https://github.com/Rafiot/officedissector.git | ||||
|     pip install git+https://github.com/CIRCL/PyCIRCLean.git | ||||
| ``` | ||||
| 
 | ||||
| * Create a new user and make mounting work with a read-only filesystem.  | ||||
| 
 | ||||
| ``` | ||||
|     useradd -m kitten | ||||
|     chown -R kitten:kitten /home/kitten | ||||
|     ln -s /proc/mounts /etc/mtab | ||||
| ``` | ||||
| 
 | ||||
| * Enable rc.local, which ensures that the code in /etc/rc.local is run on boot. | ||||
| This is what triggers CIRCLean to run. | ||||
| 
 | ||||
| ``` | ||||
|     systemctl enable rc-local.service | ||||
| ``` | ||||
| 
 | ||||
| * Exit the chroot again, and copy the files from your repository into the mounted | ||||
| image. | ||||
| 
 | ||||
| ``` | ||||
|     sudo ./copy_to_final.sh /mnt/arm_rPi/ | ||||
| ``` | ||||
| 
 | ||||
| Write the image on a SD card | ||||
| ============================ | ||||
| 
 | ||||
| * Plug your SD card into the computer. Then, find where it is mounted using df: | ||||
| 
 | ||||
| ``` | ||||
|     df -h | ||||
| ``` | ||||
| 
 | ||||
| * If it has been automatically mounted, unmount the SD card (use the path you | ||||
| found in the previous step): | ||||
| 
 | ||||
| ``` | ||||
|     umount $PATH_TO_YOUR_SD | ||||
| ``` | ||||
| 
 | ||||
| * Write the image to the card: | ||||
| 
 | ||||
| ``` | ||||
|     sudo dd bs=4M if=$PATH_TO_YOUR_IMAGE of=$PATH_TO_YOUR_SD | ||||
| ``` | ||||
|  | @ -0,0 +1 @@ | |||
| dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait fastboot noswap ro consoleblank=0 | ||||
|  | @ -19,7 +19,7 @@ cdrom:x:24:pi | |||
| floppy:x:25: | ||||
| tape:x:26: | ||||
| sudo:x:27:pi | ||||
| audio:x:29:pi | ||||
| audio:x:29:pi,timidity | ||||
| dip:x:30: | ||||
| www-data:x:33: | ||||
| backup:x:34: | ||||
|  | @ -52,3 +52,4 @@ indiecity:x:1001:root | |||
| spi:x:1002:pi | ||||
| gpio:x:1003:pi | ||||
| kitten:x:1004: | ||||
| timidity:x:110: | ||||
|  | @ -21,18 +21,13 @@ clean(){ | |||
| 
 | ||||
| echo "GROOMER: end of boot, running rc.local." | ||||
| 
 | ||||
| # Print the IP address (this doesn't work currently?) | ||||
| # _IP=$(hostname -I) || true | ||||
| # if [ "$_IP" ]; then | ||||
| #   printf "My IP address is %s\n" "$_IP" | ||||
| # fi | ||||
| 
 | ||||
| if [ -e /dev/sda ]; then | ||||
|   if [ -e /dev/sdb ]; then | ||||
|     # Avoid possible misuse - turn off eth0 (ethernet port) | ||||
|     /sbin/ifconfig eth0 down | ||||
|     trap clean EXIT TERM INT | ||||
|     cd /opt/groomer | ||||
|     /usr/sbin/led & | ||||
|     ./init.sh | ||||
|   fi | ||||
| fi | ||||
|  | @ -1,12 +1,14 @@ | |||
| [Unit] | ||||
| Description=/etc/rc.local Compatibility | ||||
| ConditionPathExists=/etc/rc.local | ||||
| 
 | ||||
| [Service] | ||||
| Type=oneshot | ||||
| ExecStart=/etc/rc.local | ||||
| Type=forking | ||||
| ExecStart=/etc/rc.local start | ||||
| TimeoutSec=0 | ||||
| StandardInput=tty | ||||
| StandardOutput=tty | ||||
| RemainAfterExit=yes | ||||
| SysVStartPriority=99 | ||||
| 
 | ||||
| [Install] | ||||
| WantedBy=multi-user.target | ||||
|  | @ -14,7 +14,7 @@ DST_MNT="/media/dst" | |||
| TEMP="${DST_MNT}/temp" | ||||
| ZIPTEMP="${DST_MNT}/ziptemp" | ||||
| LOGS="${DST_MNT}/logs" | ||||
| GROOM_LOG="/tmp/groom_log.txt" | ||||
| DEBUG_LOG="/tmp/groomer_debug_log.txt" | ||||
| MUSIC="/opt/midi/" | ||||
| 
 | ||||
| 
 | ||||
|  | @ -24,3 +24,6 @@ TIMIDITY="/usr/bin/timidity" | |||
| MOUNT="/bin/mount" | ||||
| PMOUNT="/usr/bin/pmount -A -s" | ||||
| PUMOUNT="/usr/bin/pumount" | ||||
| 
 | ||||
| # Config flags | ||||
| DEBUG=false | ||||
|  | @ -12,7 +12,11 @@ if ! [ "${ID}" -ge "1000" ]; then | |||
|     exit | ||||
| fi | ||||
| 
 | ||||
| clean(){  | ||||
| clean(){ | ||||
|     if [ ${DEBUG} = true ]; then | ||||
|         sleep 20 | ||||
|     fi | ||||
| 
 | ||||
|     # Write anything in memory to disk | ||||
|     ${SYNC} | ||||
| 
 | ||||
|  | @ -58,7 +62,7 @@ do | |||
|         # Create a directory on ${DST} named PARTION_$PARTCOUNT | ||||
|         target_dir="/media/${DST}/FROM_PARTITION_${PARTCOUNT}" | ||||
|         mkdir -p "${target_dir}" | ||||
|         LOGFILE="${LOGS}/processing.txt" | ||||
|         LOGFILE="${LOGS}/processing_log.txt" | ||||
| 
 | ||||
|         # Run the current partition through filecheck.py | ||||
|         echo "==== Starting processing of /media/${SRC} to ${target_dir}. ====" >> ${LOGFILE} | ||||
|  | @ -13,6 +13,9 @@ if [ ${ID} -ne 0 ]; then | |||
| fi | ||||
| 
 | ||||
| clean(){ | ||||
|     if [ ${DEBUG} = true ]; then | ||||
|         sleep 20 | ||||
|     fi | ||||
|     echo "GROOMER: cleaning up after init.sh." | ||||
|     ${SYNC} | ||||
|     # Stop the music from playing | ||||
|  | @ -22,15 +25,13 @@ clean(){ | |||
| 
 | ||||
| trap clean EXIT TERM INT | ||||
| 
 | ||||
| # Stop hdmi display from sleeping after a period of time | ||||
| setterm -powersave off -blank 0 | ||||
| 
 | ||||
| # Start music | ||||
| ./music.sh & | ||||
| echo $! > /tmp/music.pid | ||||
| 
 | ||||
| # List block storage devices for debugging | ||||
| # Make sure to set tee in append (-a) mode below if you uncomment | ||||
| # lsblk |& tee ${GROOM_LOG} | ||||
| if [ ${DEBUG} = true ]; then | ||||
|     lsblk |& tee -a ${DEBUG_LOG} | ||||
| fi | ||||
| 
 | ||||
| su ${USERNAME} -c ./mount_dest.sh |& tee ${GROOM_LOG} | ||||
| su ${USERNAME} -c ./mount_dest.sh |& tee -a ${DEBUG_LOG} | ||||
|  | @ -13,10 +13,13 @@ if ! [ "${ID}" -ge "1000" ]; then | |||
| fi | ||||
| 
 | ||||
| clean(){ | ||||
|     echo "GROOMER: Cleaning up in mount_keys.sh." | ||||
|     if [ ${DEBUG} = true ]; then | ||||
|         sleep 20 | ||||
|         # Copy the temporary logfile to the destination key | ||||
|         cp ${DEBUG_LOG} "${DST_MNT}/groomer_debug_log.txt" | ||||
|     fi | ||||
| 
 | ||||
|     # Copy the temporary logfile to the destination key | ||||
|     cp ${GROOM_LOG} "${DST_MNT}/groomer_log_dst.txt" | ||||
|     echo "GROOMER: Cleaning up in mount_keys.sh." | ||||
| 
 | ||||
|     # Write anything in memory to disk | ||||
|     ${SYNC} | ||||
|  | @ -17,5 +17,6 @@ amixer cset numid=3 1 | |||
| files=(${MUSIC}*) | ||||
| 
 | ||||
| while true; do | ||||
|     $TIMIDITY ${files[RANDOM % ${#files[@]}]} | ||||
|     # -id flags set interface to "dumb" and -qq silences most/all terminal output | ||||
|     $TIMIDITY -idqq ${files[RANDOM % ${#files[@]}]} | ||||
| done | ||||
							
								
								
									
										0
									
								
								fs_filecheck/usr/local/bin/pdfid.py → circlean_fs/root_partition/usr/local/bin/pdfid.py
								
								
								
								
									
									
									Normal file → Executable file
								
							
							
						
						
									
										0
									
								
								fs_filecheck/usr/local/bin/pdfid.py → circlean_fs/root_partition/usr/local/bin/pdfid.py
								
								
								
								
									
									
									Normal file → Executable file
								
							
							
								
								
									
										0
									
								
								fs_filecheck/usr/local/bin/plugin_embeddedfile.py → circlean_fs/root_partition/usr/local/bin/plugin_embeddedfile.py
								
								
								
								
									
									
									Normal file → Executable file
								
							
							
						
						
									
										0
									
								
								fs_filecheck/usr/local/bin/plugin_embeddedfile.py → circlean_fs/root_partition/usr/local/bin/plugin_embeddedfile.py
								
								
								
								
									
									
									Normal file → Executable file
								
							
							
								
								
									
										0
									
								
								fs_filecheck/usr/local/bin/plugin_list → circlean_fs/root_partition/usr/local/bin/plugin_list
								
								
								
								
									
									
									Normal file → Executable file
								
							
							
						
						
									
										0
									
								
								fs_filecheck/usr/local/bin/plugin_list → circlean_fs/root_partition/usr/local/bin/plugin_list
								
								
								
								
									
									
									Normal file → Executable file
								
							
							
								
								
									
										0
									
								
								fs_filecheck/usr/local/bin/plugin_nameobfuscation.py → circlean_fs/root_partition/usr/local/bin/plugin_nameobfuscation.py
								
								
								
								
									
									
									Normal file → Executable file
								
							
							
						
						
									
										0
									
								
								fs_filecheck/usr/local/bin/plugin_nameobfuscation.py → circlean_fs/root_partition/usr/local/bin/plugin_nameobfuscation.py
								
								
								
								
									
									
									Normal file → Executable file
								
							
							
								
								
									
										0
									
								
								fs_filecheck/usr/local/bin/plugin_triage.py → circlean_fs/root_partition/usr/local/bin/plugin_triage.py
								
								
								
								
									
									
									Normal file → Executable file
								
							
							
						
						
									
										0
									
								
								fs_filecheck/usr/local/bin/plugin_triage.py → circlean_fs/root_partition/usr/local/bin/plugin_triage.py
								
								
								
								
									
									
									Normal file → Executable file
								
							|  | @ -0,0 +1,2 @@ | |||
| led:	led.c | ||||
| 	gcc -ggdb -o led led.c | ||||
|  | @ -0,0 +1,81 @@ | |||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <stdint.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/stat.h> | ||||
| #include <fcntl.h> | ||||
| #include <sys/mman.h> | ||||
| #include <unistd.h> | ||||
| 
 | ||||
| /* GPIO registers address */ | ||||
| #define BCM2708_PERI_BASE  0x20000000 | ||||
| #define GPIO_BASE          (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */ | ||||
| #define BLOCK_SIZE         (256) | ||||
| 
 | ||||
| /* GPIO setup macros. Always use GPIO_IN(x) before using GPIO_OUT(x) or GPIO_ALT(x,y) */ | ||||
| #define GPIO_IN(g)    *(gpio+((g)/10))   &= ~(7<<(((g)%10)*3)) | ||||
| #define GPIO_OUT(g)   *(gpio+((g)/10))   |=  (1<<(((g)%10)*3)) | ||||
| #define GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3)) | ||||
| 
 | ||||
| #define GPIO_SET(g)   *(gpio+7)  = 1<<(g)  /* sets   bit which are 1, ignores bit which are 0 */ | ||||
| #define GPIO_CLR(g)   *(gpio+10) = 1<<(g)  /* clears bit which are 1, ignores bit which are 0 */ | ||||
| #define GPIO_LEV(g)  (*(gpio+13) >> (g)) & 0x00000001 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #define GPIO_4    4 | ||||
| 
 | ||||
| int                mem_fd; | ||||
| void              *gpio_map; | ||||
| volatile uint32_t *gpio; | ||||
| 
 | ||||
| int main(int argc, char* argv[]) | ||||
| { | ||||
|      int ret; | ||||
|      int i; | ||||
|      /* open /dev/mem */ | ||||
|      mem_fd = open("/dev/mem", O_RDWR|O_SYNC); | ||||
|      if (mem_fd == -1) { | ||||
|               perror("Cannot open /dev/mem"); | ||||
|               exit(1); | ||||
|      } | ||||
| 
 | ||||
|      /* mmap GPIO */ | ||||
|      gpio_map = mmap(NULL, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, GPIO_BASE); | ||||
|      if (gpio_map == MAP_FAILED) { | ||||
|              perror("mmap() failed"); | ||||
|              exit(1); | ||||
|      } | ||||
|       /* Always use volatile pointer! */ | ||||
|         gpio = (volatile uint32_t *)gpio_map; | ||||
| 
 | ||||
| 
 | ||||
|      GPIO_IN(GPIO_4); /* must use GPIO_IN before we can use GPIO_OUT */ | ||||
|      GPIO_OUT(GPIO_4); | ||||
| 
 | ||||
|     //Turn on led
 | ||||
|     while (1) { | ||||
|         //printf("Enable LED\n");
 | ||||
|         GPIO_SET(GPIO_4); | ||||
|         usleep(1000000); | ||||
|         //printf("Disable GPIO\n"); // Does not seem to work?
 | ||||
|         //GPIO_CLR(GPIO_4);
 | ||||
|         //usleep(1000000);
 | ||||
|     } | ||||
|     /* Free up ressources */ | ||||
|         /* munmap GPIO */ | ||||
|         ret = munmap(gpio_map, BLOCK_SIZE); | ||||
|         if (ret == -1) { | ||||
|                 perror("munmap() failed"); | ||||
|                 exit(1); | ||||
|         } | ||||
|         /* close /dev/mem */ | ||||
|         ret = close(mem_fd); | ||||
|         if (ret == -1) { | ||||
|                 perror("Cannot close /dev/mem"); | ||||
|                 exit(1); | ||||
|         } | ||||
| 
 | ||||
|      return EXIT_SUCCESS; | ||||
| } | ||||
							
								
								
									
										36
									
								
								doc/TODO
								
								
								
								
							
							
						
						
									
										36
									
								
								doc/TODO
								
								
								
								
							|  | @ -1,36 +0,0 @@ | |||
| TODO | ||||
| ==== | ||||
| 
 | ||||
| * the script locations should be changed in the next version so they don't sit | ||||
|    next to the rPi's example development code that ships with the stock rPi | ||||
| * the system isn't optimised and should be : cleanup and making it as close to | ||||
|   stock as possible | ||||
| [Npot sure] Starting process should be more obfuscated | ||||
| * strip exif data and leave it in a .txt file next to the image it came from | ||||
|   => exiftool | ||||
| [Done with remount] set filesystem of OS in RO (physical switch and/or remount OS) | ||||
| [OK] mount source key in RO and noexec <= also nosuid and nodev | ||||
| [OK] mount target key with noexec <= also nosuid and nodev | ||||
| * convert spreadsheets in csv ? | ||||
| [done in HTML] convert documents (pdfs/*office/...) in images ? | ||||
| [Not Needed] Have a look at Ghostscript to work on PDFs (.pdf -> .eps -> .png?) | ||||
| [do everything as user] do not run the conversions as root -> run in chroot | ||||
| * take eth0 down in /etc/network/interfaces or in the groomer script disable the | ||||
|   interface before anything happens | ||||
| * hdmi should stay up: solvable by poking the power management timer | ||||
|   (better not to disable the PM completely) | ||||
| [Done] get rid of pdfbox. remove need for java | ||||
| [WIP] scripts to generate a SD card automatically (win/mac/linux) | ||||
| * move the scripts away from /opt/ | ||||
| * strip back libreoffice to minimum required packages. in particular, if possible, | ||||
|   remove libreoffice-java-common package | ||||
| * Write the groomer log on the destination key | ||||
| [Done] use /etc/mime.types and file -b --mime-type <filename> to find out the type of | ||||
|   the file | ||||
| * Extract metadata from all the files => https://mat.boum.org/ | ||||
| 
 | ||||
| HTML Files | ||||
| ========== | ||||
| 
 | ||||
| - disable JS | ||||
| - cleanup external imports (js/css/images) | ||||
|  | @ -0,0 +1,13 @@ | |||
| TODO | ||||
| ==== | ||||
| 
 | ||||
| * strip exif data and leave it in a .txt file next to the image it came from | ||||
|   => exiftool | ||||
| * Scripts to generate a SD card automatically (win/mac/linux) | ||||
| * Extract metadata from all the files => https://mat.boum.org/ | ||||
| 
 | ||||
| HTML Files | ||||
| ========== | ||||
| 
 | ||||
| - disable JS? | ||||
| - cleanup external imports (js/css/images) | ||||
|  | @ -0,0 +1,54 @@ | |||
| * Download qemu, qemu-user-static, and proot if not already installed | ||||
| * Download the newest raspbian-lite image from raspberrypi.org | ||||
| * Verify the sha1 hash of the downloaded .zip file | ||||
| * Unzip the image | ||||
| * Expand the image by 2GB using dd | ||||
| * Expand the root partition using fdisk | ||||
| * Mount both partitions in loop mode using /shell_utils/basic_mount_image.sh | ||||
| * Use df to find the larger partition, and resize the filesystem to fill it | ||||
| * Copy circlean_fs/root_partition/etc/systemd/system/rc-local.service into the equivalent location | ||||
| * Use proot to enter a chroot in the image: sudo proot -q qemu-arm -S /mnt/rpi-root -b /mnt/rpi-boot:/boot /bin/bash | ||||
| * Run dpkg-reconfigure locales | ||||
| * apt-get update | ||||
| * apt-get dist-upgrade (might have to run this and autoremove several times) | ||||
| * apt-get autoremove | ||||
| * apt-get install the linux dependencies: | ||||
|     - timidity | ||||
|     - git | ||||
|     - p7zip-full | ||||
|     - pmount ntfs-3g | ||||
|     - python3 python3-pip | ||||
|     - python3-lxml | ||||
|     - libjpeg-dev libtiff-dev libwebp-dev liblcms2-dev tcl-dev tk-dev python-tk | ||||
| * Compile p7zip-rar from source | ||||
|     - Change your source.list file | ||||
|     - Make a new directory and cd to it | ||||
|     - apt-get build-dep p7zip-rar | ||||
|     - dpkg -i <p7zip-rar .deb file path> | ||||
| * Make sure the right pip executable is called by `pip3`, change your path if necessary | ||||
| * Upgrade pip: pip3 install -U pip | ||||
| * pip3 install python dependencies | ||||
|     - exifread | ||||
|     - pillow | ||||
|     - olefile | ||||
|     - git+https://github.com/decalage2/oletools.git | ||||
|     - git+https://github.com/grierforensics/officedissector.git | ||||
|     - git+https://github.com/CIRCL/PyCIRCLean.git | ||||
| * Add a user named "kitten" | ||||
| * Symlink /proc/mounts to /etc/mtab | ||||
| * Turn on rc-local.service `systemctl enable rc-local.service` | ||||
|     - If it doesn't work, read these instructions: https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd | ||||
| * apt-get autoclean | ||||
| * apt-get autoremove | ||||
| * Exit from proot | ||||
| * Copy all of the project files from circlean_fs/ into the two partitions: | ||||
|     - rsync -vnri <source> <destination> will do a dry run of what will be copied, remove the -n to copy. See the rsync manpage for details. | ||||
|     - diode_controller/ if you're using the led functionality and have an external led | ||||
|     - midi/ files into /opt/midi/ | ||||
|     - you might want to double check all of the permissions of the new files/directories | ||||
| * Copy the image over to the SD card: sudo dd bs=4M if=<image> of=/dev/sd<letter> | ||||
|     - In newer versions of dd, you can add status=progress | ||||
| * Optional: fsck the root partition (sudo e2fsck -f /dev/sd<letter>2). | ||||
| * Test with an rpi | ||||
|     - FAT32 filesystem | ||||
|     - NTFS filesystem | ||||
|  | @ -0,0 +1,24 @@ | |||
| Modifying an already-built image | ||||
| ================================ | ||||
| One way to debug the project or test changes quickly is to modify an already built | ||||
| version of the project. Once you've got an image set up on an SD card, you can mount | ||||
| the image and make changes to the files directly or copy changes you've made locally | ||||
| onto the mounted image. The only requirement is a linux distro such as Debian or Ubuntu. | ||||
| If you're using MacOS, you can download and install VirtualBox. | ||||
| 
 | ||||
| Mounting an image | ||||
| ================= | ||||
| * The steps listed in mount_image.sh are only necessary if you'd like to chroot | ||||
| into and run executables from the image locally. | ||||
| * To mount the image for the purpose of reading/writing to it, the process is much | ||||
| * Plug the SD card into the computer. | ||||
| * If you're on Virtualbox, you'll probably have to unmount the image on the host OS | ||||
| (on MacOS this involves ejecting it or using diskutil unmountDisk) and then mount it | ||||
| on the virtualized OS. You might have to select it under "Devices" first. | ||||
| * Then, in linux, use sudo fdisk -l to find the location of the image. | ||||
| * sudo mount $PATH_TO_IMAGE $PATH_TO_CHOSEN_MOUNT_POINT will mount the image. | ||||
| * The path to the image will need to be the path to the partition with the OS on it, | ||||
| which should be the second partition. So /dev/sdb2, not just dev/sdb. | ||||
| * When you're done, sudo umount $PATH_TO_MOUNT_POINT will unmount it. | ||||
| * If you get a warning about "No caching mode page found," it's safe to skip it | ||||
| by pressing enter. | ||||
|  | @ -0,0 +1,74 @@ | |||
| Various qemu startup commands | ||||
| ============================= | ||||
| 
 | ||||
| From https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=37386 | ||||
| qemu-system-arm -kernel ~/qemu_vms/kernel-qemu-4.4.13-jessie -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1" -hda ~/qemu_vms/2016-09-23-raspbian-jessie-lite.img -redir tcp:5022::22 | ||||
| 
 | ||||
| 
 | ||||
| From https://github.com/dhruvvyas90/qemu-rpi-kernel | ||||
| qemu-system-arm -kernel ~/qemu_vms/kernel-qemu-4.4.13-jessie -cpu arm1176 -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda ~/qemu_vms/2016-09-23-raspbian-jessie-lite.img | ||||
| 
 | ||||
| 
 | ||||
| From http://pub.phyks.me/respawn/mypersonaldata/public/2014-05-20-11-08-01/ | ||||
| qemu-system-arm -kernel <<<path to kernel>>> -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash" -hda <<<path to disk image>>> | ||||
| 
 | ||||
| 
 | ||||
| Others: | ||||
| qemu-system-arm -kernel ~/qemu_vms/kernel-qemu-3.10.25-wheezy -cpu arm1176 -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda ~/qemu_vms/2015-02-16-raspbian-wheezy.img | ||||
| 
 | ||||
| qemu-system-arm -kernel qemu-rpi-kernel/kernel-qemu-3.10.25-wheezy -cpu arm1176 -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda 2015-02-16-raspbian-wheezy.img | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| Places to get raspbian base images: | ||||
| =================================== | ||||
| 
 | ||||
| For Raspbian Wheezy image: | ||||
| wget https://downloads.raspberrypi.org/raspbian/images/raspbian-2015-02-17/2015-02-16-raspbian-wheezy.zip | ||||
| 
 | ||||
| For Raspbian Jessie Lite image: | ||||
| wget https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2016-09-28/2016-09-23-raspbian-jessie-lite.zip | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| Traceback of the qemu failure on digitalocean | ||||
| ============================================= | ||||
| 
 | ||||
| pulseaudio: pa_context_connect() failed | ||||
| pulseaudio: Reason: Connection refused | ||||
| pulseaudio: Failed to initialize PA contextaudio: Could not init 'pa' audio driver | ||||
| ALSA lib confmisc.c:768:(parse_card) cannot find card '0' | ||||
| ALSA lib conf.c:4259:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory | ||||
| ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings | ||||
| ALSA lib conf.c:4259:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory | ||||
| ALSA lib confmisc.c:1251:(snd_func_refer) error evaluating name | ||||
| ALSA lib conf.c:4259:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory | ||||
| ALSA lib conf.c:4738:(snd_config_expand) Evaluate error: No such file or directory | ||||
| ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM default | ||||
| alsa: Could not initialize DAC | ||||
| alsa: Failed to open 'default': | ||||
| alsa: Reason: No such file or directory | ||||
| ALSA lib confmisc.c:768:(parse_card) cannot find card '0' | ||||
| ALSA lib conf.c:4259:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory | ||||
| ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings | ||||
| ALSA lib conf.c:4259:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory | ||||
| ALSA lib confmisc.c:1251:(snd_func_refer) error evaluating name | ||||
| ALSA lib conf.c:4259:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory | ||||
| ALSA lib conf.c:4738:(snd_config_expand) Evaluate error: No such file or directory | ||||
| ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM default | ||||
| alsa: Could not initialize DAC | ||||
| alsa: Failed to open 'default': | ||||
| alsa: Reason: No such file or directory | ||||
| audio: Failed to create voice 'lm4549.out' | ||||
| Could not initialize SDL(No available video device) - exiting | ||||
| 
 | ||||
| 
 | ||||
| Notes | ||||
| ===== | ||||
| - The error message: it is probably not a big deal - can make them not being blocking by modifying https://github.com/CIRCL/Circlean/blob/master/tests/run.exp#L10 | ||||
| - https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=760365 | ||||
| - Could not initialize SDL(No available video device) - exiting <= this one is blocking | ||||
| - I guess it is the vnc switch - requires x11 installed | ||||
| - If you use a cloud instance, you will need to get qemu to open a port you can connect to with vnc | ||||
| - The good thing of having VNC is that you can see what explodes when you're running the image | ||||
|  | @ -0,0 +1,224 @@ | |||
| Building the image from scratch | ||||
| =============================== | ||||
| 
 | ||||
| There is always a prebuilt image available for download and installation as | ||||
| described in the [README](../README.md). If you'd like to build the project yourself, | ||||
| there are several steps involved: | ||||
| 
 | ||||
| * Downloading a generic Raspbian Lite image | ||||
| * Resizing the image and partition | ||||
| * Downloading and building the dependencies | ||||
| * Modifying the image configuration | ||||
| * Copying the project filesystem into the image | ||||
| 
 | ||||
| This procedure will only work on Ubuntu or Debian Linux. If you use MacOS or | ||||
| Windows, the best option is to install Linux in a virtual machine using | ||||
| something like VirtualBox. | ||||
| 
 | ||||
| It is recommended that you make a copy of image_setup_checklist.md and √ items off | ||||
| on the list as you go. | ||||
| 
 | ||||
| Preparation | ||||
| =========== | ||||
| 
 | ||||
| * Make sure your development environment is up to date: | ||||
| ``` | ||||
|     apt-get update | ||||
|     apt-get dist-upgrade | ||||
| ``` | ||||
| * Install qemu, qemu-user-static, and proot if not already installed: | ||||
| ``` | ||||
|     apt-get install qemu qemu-user-static proot | ||||
| ``` | ||||
| 
 | ||||
| Download the Raspbian image | ||||
| ============================== | ||||
| 
 | ||||
| * Get the most recent version of Raspbian Jessie Lite from https://downloads.raspberrypi.org/raspbian_lite/images/: | ||||
| 
 | ||||
| ``` | ||||
|    wget https://downloads.raspberrypi.org/raspbian_lite_latest | ||||
| ``` | ||||
| * Verify the hash of the downloaded file and compare it to the hash on the server: | ||||
| ``` | ||||
|     shasum XXXX-XX-XX-raspbian-jessie-lite.zip | ||||
| ``` | ||||
| * Unpack it: | ||||
| ``` | ||||
|     unzip XXXX-XX-XX-raspbian-jessie-lite.zip | ||||
| ``` | ||||
| 
 | ||||
| Add space to the image | ||||
| ========================= | ||||
| 
 | ||||
| * Use dd to add 2GB (2048 blocks of 1024k each). Using /dev/zero as the input | ||||
| file yields an unlimited number of "0x00" bytes. | ||||
| ``` | ||||
|     > dd if=/dev/zero bs=1024k count=2048 >> XXXX-XX-XX-raspbian-jessie-lite.img | ||||
| ``` | ||||
| * Expand the root (second) partition using fdisk. The first partition listed is the boot | ||||
| partition, which shouldn't be changed. In the new partition, the "First sector" should be | ||||
| the value that was the "start" sector of the old root partition (137216 in the example | ||||
| below, but this varies depending on the version of the Raspbian image). The "Last sector" | ||||
| should be the default, and it should be significantly larger than it was before (6909951 vs. | ||||
| 2715647 in the example). | ||||
| 
 | ||||
| ``` | ||||
|     > fdisk XXXX-XX-XX-raspbian-jessie-lite.img | ||||
| 
 | ||||
|     Command (m for help): *p* | ||||
|     Disk XXXX-XX-XX-raspbian-jessie-lite.img: 3.3 GiB, 3537895424 bytes, 6909952 sectors | ||||
|     Units: sectors of 1 * 512 = 512 bytes | ||||
|     Sector size (logical/physical): 512 bytes / 512 bytes | ||||
|     I/O size (minimum/optimal): 512 bytes / 512 bytes | ||||
|     Disklabel type: dos | ||||
|     Disk identifier: 0x244b8248 | ||||
| 
 | ||||
|     Device                               Boot  Start     End Sectors  Size Id Type | ||||
|     XXXX-XX-XX-raspbian-jessie-lite.img1        8192  137215  129024   63M  c W95 FAT32 (LBA) | ||||
|     XXXX-XX-XX-raspbian-jessie-lite.img2      137216 2715647 2578432  1.2G 83 Linux | ||||
| 
 | ||||
|     Command (m for help): *d* | ||||
|     Partition number (1,2, default 2): *2* | ||||
| 
 | ||||
|     Partition 2 has been deleted. | ||||
| 
 | ||||
|     Command (m for help): *n* | ||||
|     Partition type | ||||
|        p   primary (1 primary, 0 extended, 3 free) | ||||
|        e   extended (container for logical partitions) | ||||
|     Select (default p): | ||||
| 
 | ||||
|     Using default response p. | ||||
|     Partition number (2-4, default 2): | ||||
|     First sector (2048-6852607, default 2048): *137216* | ||||
|     Last sector, +sectors or +size{K,M,G,T,P} (131216-6909951, default 6909951): | ||||
| 
 | ||||
|     Created a new partition 2 of type 'Linux' and of size 3.2 GiB. | ||||
| 
 | ||||
|     Command (m for help): *w* | ||||
|     The partition table has been altered. | ||||
|     Syncing disks. | ||||
| ``` | ||||
| * Mount the image in loop mode: first, edit shell_utils/basic_mount_image.sh to use the | ||||
| proper values for $BOOT_START and $ROOT_START, which you can obtain using fdisk and "p" | ||||
| as in the previous step. You must also change $IMAGE to the correct path. Then run: | ||||
| ``` | ||||
|     sudo ./shell_utils/basic_mount_image.md | ||||
| ``` | ||||
| * Verify the path to the mounted partitions in /dev, and resize the root (larger) filesystem | ||||
| to fill the new larger partition using resize2fs: | ||||
| ``` | ||||
|     > df | grep /mnt/arm | ||||
| 
 | ||||
|     /dev/loop0                3927752   1955672   1794172  53% /mnt/rpi-root | ||||
|     /dev/loop1                  57288     18960     38328  34% /mnt/rpi-boot | ||||
| 
 | ||||
|     > sudo resize2fs /dev/loop0 | ||||
| ``` | ||||
| 
 | ||||
| Installing the dependencies | ||||
| =========================== | ||||
| 
 | ||||
| * Copy circlean_fs/root_partition/systemd/system/rc-local.service into the equivalent location in the image. | ||||
| ``` | ||||
|     cp circlean_fs/root_partition/systemd/system/rc-local.service /mnt/rpi-root/etc/systemd/system/rc-local.service | ||||
| ``` | ||||
| * Use [proot](https://proot-me.github.io/) to enter the equivalent of a chroot inside | ||||
| the mounted image. | ||||
| ``` | ||||
|     sudo proot -q qemu-arm -S /mnt/rpi-root -b /mnt/rpi-boot:/boot /bin/bash | ||||
| ``` | ||||
| * Change your locales (remove "en_GB.UTF-8 UTF-8", add "en_US.UTF-8 UTF-8"). The | ||||
| arrow keys move the cursor, spacebar selects/deselects a locale, tab moves the cursor | ||||
| to a different context, and enter lets you select "ok". This step might take some time, | ||||
| be patient: | ||||
| ``` | ||||
|     dpkg-reconfigure locales | ||||
| ``` | ||||
| * In the image, make sure everything is up-to-date and remove old packages. You may have to | ||||
| run dist-upgrade and autoremove several times for everything to be installed, and a few | ||||
| raspbian-sys-mods related installs may fail - you can ignore them: | ||||
| ``` | ||||
|     apt-get update | ||||
|     apt-get dist-upgrade | ||||
|     apt-get autoremove | ||||
| ``` | ||||
| * Install the linux dependencies (see CONTRIBUTING.md for more details): | ||||
| ``` | ||||
|     apt-get install timidity git p7zip-full python3 python3-pip python3-lxml pmount ntfs-3g libjpeg-dev libtiff-dev libwebp-dev tk-dev python-tk liblcms2-dev tcl-dev | ||||
| ``` | ||||
| * Compile p7zip-rar from source. First, uncomment out the second line in /etc/apt/sources.list. Then: | ||||
| ``` | ||||
|     cd /home/pi | ||||
|     mkdir rar && cd rar/ | ||||
|     apt-get build-dep p7zip-rar | ||||
|     dpkg -i ${path to p7zip-rar .deb file} | ||||
| ``` | ||||
| * Install the Python dependencies for PyCIRCLean/filecheck.py. PyCIRCLean is 3.3+ | ||||
| compatible, so use pip -V to make sure you're using the right version of pip. You might | ||||
| have to edit your PATH variable or use pip3 to get the correct pip. You also might want to | ||||
| verify that these dependencies are current by checking in the PyCIRCLean git repo. | ||||
| ``` | ||||
|     pip install -U pip | ||||
|     pip install oletools exifread Pillow | ||||
|     pip install git+https://github.com/decalage2/oletools.git | ||||
|     pip install git+https://github.com/Rafiot/officedissector.git | ||||
|     pip install git+https://github.com/CIRCL/PyCIRCLean.git | ||||
| ``` | ||||
| * Create a new user named "kitten": | ||||
| ``` | ||||
|     useradd -m kitten | ||||
|     chown -R kitten:kitten /home/kitten | ||||
| ``` | ||||
| * Symlinking /proc/mounts to /etc/mtab is necessary because /etc/mtab cannot be edited by | ||||
| pmount if root is read-only. /proc/mounts is maintained by the kernel and is guaranteed to | ||||
| be accurate. | ||||
| ``` | ||||
|     ln -s /proc/mounts /etc/mtab | ||||
| ``` | ||||
| * Enable rc.local, which ensures that the code in /etc/rc.local is run on boot. | ||||
| This is what triggers CIRCLean to run. | ||||
| ``` | ||||
|     systemctl enable rc-local.service | ||||
| ``` | ||||
| * Clean up: | ||||
| ``` | ||||
|     apt-get clean | ||||
|     apt-get autoremove | ||||
|     apt-get autoclean | ||||
| ``` | ||||
| * Exit proot, and copy the files from your repository into the mounted | ||||
| image. Adding a -n flag will make rsync do a dry run instead of copying. See the rsync | ||||
| manpage for more details. Make sure to include the trailing slashes on the paths: | ||||
| ``` | ||||
|     exit | ||||
|     sudo rsync -vri circlean_fs/boot/ /mnt/rpi-boot/ | ||||
|     sudo rsync -vri circlean_fs/root_partition/ /mnt/rpi-root/ | ||||
|     cp -rf midi /mnt/rpi-root/opt/ | ||||
| ``` | ||||
| * If have an external hardware led and you're using the led functionality, copy | ||||
| the led files from diode_controller/ as well. | ||||
| 
 | ||||
| Write the image on a SD card | ||||
| ============================ | ||||
| 
 | ||||
| * Plug your SD card into the computer. Then, find where it is mounted using lsblk or df: | ||||
| ``` | ||||
|     lsblk | ||||
|     df -h | ||||
| ``` | ||||
| * If it has been automatically mounted, unmount the SD card (use the path you | ||||
| found in the previous step): | ||||
| ``` | ||||
|     umount $PATH_TO_YOUR_SD | ||||
| ``` | ||||
| * Write the image to the card. Newer versions of dd include a status option to monitor the | ||||
| copying process: | ||||
| ``` | ||||
|     sudo dd bs=4M if=$PATH_TO_YOUR_IMAGE of=$PATH_TO_YOUR_SD status=progress | ||||
| ``` | ||||
| * Use fsck to verify the root partition: | ||||
| ``` | ||||
|     sudo e2fsck -f /dev/sd<number>2 | ||||
| ``` | ||||
|  | @ -16,14 +16,14 @@ Ideas | |||
| ===== | ||||
| 
 | ||||
| Source keys: | ||||
| [DONE] Working documents, one / multiple partitions | ||||
| - Working documents, one / multiple partitions | ||||
| - Non working documents: one / multiple partitions | ||||
| - different FS on different partitions | ||||
| - Non working FS | ||||
| - Malicious documents (very slow, might break the conversions) | ||||
| 
 | ||||
| Destinations keys | ||||
| [DONE] empty, big enough | ||||
| - empty, big enough | ||||
| - empty, too small | ||||
| - broken | ||||
| - not empty | ||||
|  |  | |||
|  | @ -0,0 +1,39 @@ | |||
| #!/bin/bash | ||||
| 
 | ||||
| # This script will mount a given image in loop mode. | ||||
| # Make sure to change the path and offsets for the image you use. You can get | ||||
| # the correct offsets using `file $PATH_TO_IMAGE` or fdisk. | ||||
| 
 | ||||
| # To make debugging easier | ||||
| echo "KittenGroomer: in mount_image.sh" 1>&2 | ||||
| 
 | ||||
| if [ "$(id -u)" != "0" ]; then | ||||
|    echo "This script must be run as root" 1>&2 | ||||
|    exit 1 | ||||
| fi | ||||
| 
 | ||||
| set -e | ||||
| set -x | ||||
| 
 | ||||
| # Double check the path and offsets as noted above! | ||||
| # Path to the image | ||||
| IMAGE='2017-02-02_CIRCLean.img' | ||||
| # Start sector of boot (first) partition | ||||
| BOOT_START=8192 | ||||
| # Start sector of root (second) partition | ||||
| ROOT_START=137216 | ||||
| # Locations you'd like the partitions mounted | ||||
| BOOT_PATH='/mnt/rpi-boot' | ||||
| ROOTFS_PATH='/mnt/rpi-root' | ||||
| 
 | ||||
| # Calculate offsets for each partition | ||||
| offset_boot=$((${BOOT_START} * 512)) | ||||
| offset_rootfs=$((${ROOT_START} * 512)) | ||||
| # TODO: add logic for creating directories if they aren't already there | ||||
| mkdir -p ${BOOT_PATH} | ||||
| mkdir -p ${ROOTFS_PATH} | ||||
| # Mount each partition in loop mode | ||||
| mount -o loop,offset=${offset_boot} ${IMAGE} ${BOOT_PATH} | ||||
| mount -o loop,offset=${offset_rootfs} ${IMAGE} ${ROOTFS_PATH} | ||||
| 
 | ||||
| echo "Image mounted" 1>&2 | ||||
|  | @ -1,12 +0,0 @@ | |||
| #!/bin/bash | ||||
| 
 | ||||
| set -x | ||||
| 
 | ||||
| # cp /media/sf_ubuntu-shared/Circlean-Ubuntu/fs_filecheck/opt/groomer/init.sh /mnt/rpi/opt/groomer/init.sh | ||||
| # cp /media/sf_ubuntu-shared/Circlean-Ubuntu/fs_filecheck/opt/groomer/groomer.sh /mnt/rpi/opt/groomer/groomer.sh | ||||
| # cp /media/sf_ubuntu-shared/Circlean-Ubuntu/fs_filecheck/opt/groomer/config.sh /mnt/rpi/opt/groomer/config.sh | ||||
| # cp /media/sf_ubuntu-shared/Circlean-Ubuntu/fs_filecheck/opt/groomer/mount_dest.sh /mnt/rpi/opt/groomer/mount_dest.sh | ||||
| # cp /media/sf_ubuntu-shared/Circlean-Ubuntu/fs_filecheck/opt/groomer/music.sh /mnt/rpi/opt/groomer/music.sh | ||||
| # cp /media/sf_ubuntu-shared/Circlean-Ubuntu/fs_filecheck/etc/rc.local /mnt/rpi/etc/rc.local | ||||
| # cp /media/sf_ubuntu-shared/Circlean-Ubuntu/fs_filecheck/etc/pmount.allow /mnt/rpi/etc/pmount.allow | ||||
| # cp /media/sf_ubuntu-shared/Circlean-Ubuntu/fs_filecheck/etc/udev/rules.d/10-usb.rules /mnt/rpi/etc/udev/rules.d/10-usb.rules | ||||
		Loading…
	
		Reference in New Issue
	
	 Raphaël Vinot
						Raphaël Vinot