For security reasons, it is desirable to check the integrity of code before execution, avoiding tampered software by an attacker. So, my question is
How to sign executable code and run only trusted software under Linux?
I have read the work of van Doom et al., Design and implementation of signed executables for Linux, and the IBM's TLC (Trusted Linux Client) by Safford & Zohar. TLC uses TPM controller, what is nice, but the paper is from 2005 and I was unable to find current alternatives.
Do you know another options?
UPDATE: And about other OS's? OpenSolaris? BSD family?
Take a look at Medusa DS9. I played with it a long (long) time ago, but if I remember correctly, you could register specific binaries and any modification was not allowed at the kernel level. Of course, it can be overridden with local access to the machine, but it was not really easy. There's a smart daemon, called constable, checking everything that happens on the machine and if something out of the ordinary occurs, it start screaming.
I can answer the question from a Solaris 10 & 11 OS perspective, all binaries are signed. To verify the signature use 'elfsign'...
Oracle have recently added a verified boot process for Solaris 11 too, for details see - Solaris Verified Boot Introduction
There are some production grade forks of the OpenSolaris code, three worth investigating are Illumos, SmartOS and OmniOS.
Have a look at this: http://linux-ima.sourceforge.net/
It's not signing yet, but it still enables verification.
I've never tried it, but take a look at : http://blog.codenoise.com/signelf-digitally-signing-elf-binaries. The solution works without needing kernel support, and looks like to be ready to go.
The code for the signer can be found at http://sourceforge.net/projects/signelf/
It does not solve the "Run only trusted code on linux" question, but it does partially solve the problem by making a way for the program to detect itself a possible tampering/corruption
http://en.wikipedia.org/wiki/PKCS
Use a PKCS7 (S/MIME) sign of it. Generate your own cert/private key pair, self-sign the cert and then sign your file with the private key and cert using PKCS7. It'll attach the cert to it, and then it can check itself at runtime using the openssl command (man smime or just do openssl help). This is tamperproof because even though the public key is in the files you give out, the S/MIME signature for that public key can only be generated with the private key which you won't distribute. So if the file is signed by your cert, it must have been signed by someone with the private key and since you didn't give the private key to anyone, it must have come from you.
Here's how to make the self-signed certificate.
http://www.akadia.com/services/ssh_test_certificate.html
You'll have to convince openssl to trust your cert as a root of authority (-CAfile), then check it with that as the root, and also check the cert on the file is yours (hash the cert) and check the hash. Note that although it isn't documented, the exit status of openssl reflects the validity of the sign you are checking when doing an smime verify. It's 0 if it matches, non-zero if it doesn't.
Note that all of this is not secure because if the check is in your code, they can simply remove the check if they want to beat you. The only secure way to do it would be to have the checker in the OS and have it check your binary and refuse to run it if it isn't signed. But since there is no checker in the OS and linux can be modified to remove/bypass it anyway... What this is really good for is just detecting corrupt files more than trying to keep people from bypassing you.
The DigSig kernel module implements verification of binaries signed by a tool called
bsign
. However, there hasn't been any work on it since version 2.6.21 of the Linux kernel.