Re: Side-channel vulnerability in libgcrypt - the Marvin Attack

Jacob Bachmeyer via Gcrypt-devel <[email protected]>
Newsgroups gmane.comp.encryption.gpg.libgcrypt.devel
Message-ID <[email protected]>
NIIBE Yutaka wrote:
> Hello,
>
> Jacob Bachmeyer <[email protected]> wrote:
>   
>> Otherwise, a non-standard malicious host could "bend" the slot timing
>> enough that the fixed response delay is not always sufficient for the
>> operation to complete.
>>     
>
> True.  Thank you for showing this possibility.  I didn't consider this
> point.
>   

To be fair, when I said "non-standard", I meant a USB host implemented 
either using a programmable logic device or by bit-banging on MCU GPIO 
pins.  I do not believe that a PC's USB host controller, for example, 
will allow that.  I would expect standard hardware USB hosts to enforce 
spec-compliant bus timing beyond software control.  Therefore, the token 
should shut down or possibly even wipe itself if it detects such 
incorrect timing.

> Well, in general, I suggest not keeping a USB token inserted into a host.
>
> There are possibilities (in theory, or in history) that a decryption
> service by a USB token might be providing a decryption oracle to an
> attacker by some channel(s).
>
> When a user has a practice of only powering the device when needed,
> bandwidth to an attacker could be small, hopefully small enough.  Slower
> service is better too, for smaller bandwidth.
>   

Leaving the token connected to the host and active (unlocked) raises a 
different hazard:  the token would then be available for malware on the 
host to abuse at will.  This largely defeats the purpose of using a 
token in the first place, as the security benefits of tokens center 
around preserving the security of the key even if the host is compromised.

Obvious decryption oracle:  just ask the token to decrypt the 
ciphertext.  If it is connected and unlocked, it will.  Oops.

> It is a bit off-topic (from the original report).  Sorry, It was me who
> addressed USB communication.
>
> And... yes, it's true that it's hard for programming to estimate
> worst-case running time, it's also hard to guarantee constant-time
> running time, in a given situation of programming environment and
> hardware architecture.
>   

The basic method is to do both sides of every branch and select the 
result with the equivalent of a multiplexer.  This obviously does not 
work for loop-test branches, since loops must eventually terminate, and 
still requires care at higher-levels that the set (and possibly 
sequence) of operations performed is invariant with respect to secret 
data, but it is possible as I understand.

This may also require avoiding the use of sufficiently-advanced 
processors, if any exist that can detect that the result of a 
speculative execution chain will not be used and elide the chain.  This 
could also be a good application for tokens containing simpler 
processors intended for security over performance, if main processors 
get advanced enough to do that.


-- Jacob
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.