Proposal: integrity checks for packages and cryptographic signing

Martin Graesslin mgraesslin at kde.org
Mon Jan 4 09:39:19 UTC 2016


Hi all,

happy new year! I had a too long Christmas break and spent quite some thinking 
about how to improve the security situation on Plasma/Wayland and I think I 
found a solution to address one of the problems.

tldr: we need to sign installed packages and verify the integrity when loading 
the package.

== Attack scenario ==
A browser has a vulnerability allowing drive-by downloads to $HOME. This 
allows an attacker to store KPackages (e.g. Plasmoids) which will get loaded 
by the application using the malicious data. What are the threats of this:

1. Declarative/QML kwin scripts: a declarative kwin script is able to take 
over rendering of the system and intercept all input events. This is 
comparable to running an X Server.

2. A Plasmoid is able to render a window thumbnail to a frame buffer object 
and store/send it somewhere. This is a violation of secure screenshots. Also 
as Plasma dialogs can place themselves it allows to take over the system in 
similar ways as on X11.

3. A look'n'feel package can install a key logger into the lock screen.

== What I want to solve? ==

I do not want to prevent the attack vectors outlined above as that's a futile 
exercise. Thus I want to return to "if it runs it's trusted" in a reliable 
way. If a user downloads a plasmoid it's trusted, but a drive-by download is 
not trusted. Thus we need to establish "trust".

== How to get there? ==

My proposal is that while packages get installed the sha-sum of each file gets 
calculated and written into a shasums file. The shasums file gets 
cryptographically signed and both the shasums file and the signature get 
installed as well.

On loading a package we traverse the package install location, generate the 
sha-sum of each found file, check that it exists in the shasums file, verify 
it's correct. In addition we check that the signature is valid and that all 
files listed in shasums were found. If any of the checks failed we abort 
loading the package.

== What will this solve? ==

By verifying the signature we know that the shasums file was not modified. By 
checking the shasum file of each file we know that those were not modified. By 
checking that no file was added or removed, we ensure that the integrity 
matches also in that way.

Overall this gives us an integrity check for the package. We know it wasn't 
tampered with since it got installed.

For the attack scenario this means: A drive-by download cannot just install a 
package or overwrite files. This would break the integrity check and the 
manipulated package would not be loaded. Similar it would not be able to 
install a malicious package as it's not able to sign it.

== What that means for developer setups? ==

Generating the shasum and signing the packages must become part of the general 
package installing. Rolling this out must not affect our own dev setup. Thus 
also plasmoidviewer should not require a valid signature as that's just not 
dev friendly.

In addition we must make it as easy as possible to allow developers to install 
their own private cert file and integrate the signing key into kdesrc-build/
cmake, so that just running kdesrc-build signs all packages with the private 
key. Our signature validation infrastructure must make it possible to have 
additional certificates installed in a global (not user) location. This should 
work for common dev setups installing to e.g. /opt as well. E.g. it should 
honor my /opt/kf5/etc/ location.

Overall: for devs it must not be disruptive! And that's possible.

== What this means for distributions? ==

That's where I fear opposition to the plan. We must integrate distributions 
early enough. Here I think key is that we don't sign our own packages, but let 
distributions sign them. That way distributions still have control over it, 
can change packages, add own, etc. The setup for developers should make that 
possible. Also a possibility is that we sign the distros certificate with our 
root certificate - but that's an implementation detail.

== What this means for 3rd party developers? ==

We need to setup a signing infrastructure.

== How to roll it out? ==

The last point makes it obvious: this will take time. We cannot just go there 
and enable it in next plasma release as that would break 3rd party developed 
packages.

Thus I suggest the following steps:
1. change the install command to generate the shasums
2. implement generic infrastructure in KPackage to validate the shasums/
signature
3. start to use it in KWin/Wayland for all scripted elements (security risk 
really high)
4. start setup CA infrastructure
5. start signing 3rd party plasmoids
6. start validating packages, but allow to still load not-signed packages
7. on Wayland switch over

The last point I think should not happen in 2016. So we have about a year to 
get everybody on board.

== This whole thing is futile, because... ==

because there are so many other ways to take over control over the system? 
That's true, let's fix them and make the system secure! Please don't oppose 
ideas to make the system more secure because there are other insecure 
elements. I'm trying to look at the big picture here.

== Will it affect startup time? ==

Obviously generating the sha-sum requires loading the file and performing a 
calculation. This takes time, but I don't think it will affect startup time. 
It's a highly concurrent situation: we have many files to check, so that can 
all be threaded. Most of the time will probably be on file loading and we have 
to do that anyway. The new API must be designed in an async way. I'm thinking 
of something like:
QFuture<ValidationResult> validate(ValidationFlags flags);

== Signing packages doesn't protect against malicious code ==

That's true, but that's not what I want to solve. But it will make it less 
likely that the package is malicious as someone will have looked at the code 
to sign it. Currently packages on kde-look.org or any other location are not 
checked, so this can only improve the situation.

== Why not verify whether the files are root owned? ==

This was my initial idea for solving the problem in KWin, but this would be 
highly disruptive to developers and also 3rd party devs and users.

== Why not verify root owned as another way to signing? ==

Because it just makes the code more complex. Let's just sign all files and have 
one way instead of multiple.

== Why this mail on plasma-devel and not frameworks? ==

Because Plasma is currently the main user of KPackage, so I want to discuss in 
the inner group first, before going to the big exposure.

----

Long mail, sorry about that. But I wanted to outline the idea properly as it's 
security relevant. If you have further questions, please ask. I spent days 
thinking about this during my vacations, so I'm sure I already thought about 
your question as well ;-)

Cheers
Martin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: This is a digitally signed message part.
URL: <http://mail.kde.org/pipermail/plasma-devel/attachments/20160104/d9632dc5/attachment-0001.sig>


More information about the Plasma-devel mailing list