Roberto Guanciale Mads Dam Hamed Nemati Christoph Baumann Cache Storage Channels Alias-driven Attacks
Formally Verified Platforms
Formally Verified Platforms
Caches Excluded Formally Verified from the analysis Platforms
Caches Excluded Formally Verified from the analysis Platforms
Caches Excluded Formally Verified from the analysis Platforms
Caches Excluded Formally Verified from the analysis Platforms
Caches Excluded Formally Verified from the analysis Platforms Models should be Sound
Caches Excluded Formally Verified from the analysis Platforms Models should be Sound Storage Channels can invalidate results
Cacheable (std-memory) Virtual MMU Address Non-cacheable (devices) Page T ables Incoherent Cache Behaviors
Mismatched cacheability attributes
Mismatched cacheability attributes do not do this
Mismatched cacheability attributes Please, do not do this
Mismatched cacheability attributes Please, do not do this Incoherent Cache Behaviors
Mismatched cacheability attributes Please, do not do this Incoherent Cache Behaviors ARM-terminology: unexpected cache hit if the data cache reports a hit on a memory location that is marked as non- cacheable, the cache might access the memory disregarding such hit.
OS OS Hypervisor Scenarios
ARM OS OS OS TrustZone Service Hypervisor Scenarios
ARM OS OS OS TrustZone Service Hypervisor Device User Driver Process Scenarios Kernel
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 0 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 0 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 0 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 0 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 0 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … 0 F D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 0 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … 0 F D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 1 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … 0 F D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 1 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … 0 F D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 1 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … 0 F D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 1 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … 0 F D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 1 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … 0 F D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 1 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … 0 F D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 1 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … 0 F D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 1 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … 0 F D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 1 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … 0 F D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 1 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … 0 F D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … D = = 0 u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 1 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … 0 F D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … D = = 0 u s e ( V A _ c )
Attacker w r i t e ( V A _ n c , 0 ) … memory w r i t e ( V A _ n c , 1 ) VA_nc 1 f r e e ( V A _ n c ) Victim PA cache D = a c c e s s ( V A _ c ) line dirty VA_c … 0 F D = a c c e s s ( V A _ c ) i f n o t p o l i c y ( D ) R e j e c t ( ) … e v i c t i o n u s e ( V A _ c )
Recommend
More recommend