[LEDE-DEV] automated signed firmware upgrades / hide a secret in image
Michael Richardson
mcr at sandelman.ca
Fri Feb 24 09:44:19 PST 2017
Bastian Bittorf <bb at npl.de> wrote:
> * Michael Richardson <mcr at sandelman.ca> [24.02.2017 09:03]:
>> > large random primenumbers. On the serverside, we store the product >
>> (aka: solution) of these 2 numbers. This is repeated for each
>> generated > image. (sorry, it breaks reproducable builds for now)
>>
>> Anyone can multiply two large prime numbers to get the solution.
> oh, i was thinking that when you have a large number, e.g.
> 11542007683190179498670464887074061547264589525228033835453784092033868174972196125349942808504088511053804942426194431961451801392254016733776993893835781
> you can not easily say what the 2 prime factors are to get this result?
> Or is this really a "fast" cumputation?
That's the essence of assymetric cryptographic algorithms, yes.
But, you don't want to create your own, because there are subtlies which
matter. And I don't think you used this mechanism right. If you really want
to go this way, and can assume you have libssl around, then it will let
do a signature rather easily.
>> So I can't understand what you are doing. You can't hide things in
>> binaries. That's total snake oil.
> It is, it's only about having a proof, that the image runs. If several
> people "say" that the image runs, other routers start to automatically
> flash it. I want to make sure, that nobody can fake that information it
> easily.
Ah, I see. So what you want is a stamp in the image which is returned to
a server as a kind of "weather report" on whether or not the image is
succesfully being used.
The threat profile is rather moderate.
Nobody really gains that much by gaming the system.
I think having a stamp in the image which uniquely identifies it is enough.
I don't think you need any cryptography at all. Just https: POST the
contents of the magic file to the vote taker.
===== but ===== too-long version follows :-)
If you want to do some kind of defense against spamming of the server by
random twits, then do this:
1) create your secret on build server, make it 32-bytes in length.
(SHA256 output of some stuff on the build server, including time)
2) call the first 16 bytes the build-identifier, base64 it. Or perhaps
bubble-babble it, and show it to the user, etc. as the recognizable
build name.
GET https://server.example.com/nonce/build-identifier-stuff
-> returns 16-byte random challenge, Q.
3) call the second 16 bytes the build-secret.
AES128 encrypt (Q) using build-secret as the key. Call this the
build-challenge-response token.
POST https://server.example.com/nonce/build-identifier-stuff
post-content has base64 of response token.
4) the server can use it's copy of the build-secret to decrypt the
response-token, and verify that it is the same challenge that it
gave out before.
The server can either given everyone during a period of an hour the same
random challenge, it can make them up and store them, or it can construct
them as the HMAC-SHA256 of, for instance, the IP address which is asking,
such that it never has to record any of them.
A script kiddie now needs to do some work each time, has to request a new
token each time, and if the challenges are based upon IP address, the kiddie
can vote once per IP address they have. So, now they need a bot net to
vote a lot... probably that's okay.
>> I thought from the subject line and explanation that it was to permit
>> a firmware image to be validated as being uncorrupted/tained. One
>> might do this before flashing a device with it.
> how should this be done before flashing? if there is a mistake
> (e.g. forgotten package during build) the image itself is fine, but not
> "good".
Right. So getting the stamp into the image at the very last moment is the
key. That way the build is reproduceable if you ignore those very few bytes.
Ideally, there is a spot in the image that shows up to userspace. Have you
figured this part out? I would attempt to make it a kernel boot command
line option, if that can be tweaked easily.
I think you've figured this part already though.
For a u-boot image, maybe skipping it into the image name.
I'm not sure what the sysupgrade.bin format is... mkimage -l says
those images are corrupt, but file says it's a uboot legacy image.
> and an sha256_signature if the image-hash. These hashes are added to
> the info.json:
> http://intercity-vpn.de/networks/liszt28/firmware/models/Buffalo%20WZR-HP-AG300H/testing/Standard,DSLR,fotobox,kalua/info.json
> (see: 'bittorf').
> Other users have installed my public.key and can so check the
> signature. Also to flag "firmware_manually_checked" is changed to
> 'true'.
--
] Never tell me the odds! | ipv6 mesh networks [
] Michael Richardson, Sandelman Software Works | network architect [
] mcr at sandelman.ca http://www.sandelman.ca/ | ruby on rails [
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 487 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/lede-dev/attachments/20170224/78b85457/attachment.sig>
More information about the Lede-dev
mailing list