HW5
- Due Dec 10, 2019 by 11:59pm
- Points 100
- Submitting a file upload
- Available Nov 21, 2019 at 2:59pm - Dec 20, 2019 at 11:59pm
This homework assignment needs you to understand caches structures and their behavior in modern processors to create a cache side-channel attack. This is a group assignment with a max group size of 2. Remember to write down the group members’ names in the ID file, and only one group member should make a submission in Canvas.
The files required for this assignment: hw5.zip Download hw5.zip
Environment
It is highly recommended that you perform this assignment on any system with an Intel processor. You can use the CSL instructional machines to carry out this assignment.
You can use lscpu to figure out details about the processor and the cache. For example,
[chatterjee@royal-12: h/chatterjee]$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
. . .
L1d cache: 32K # 64 sets, 8 ways , 64 byte block
L1i cache: 32K
L2 cache: 256K
L3 cache: 6144K
. . .
Part A: Calibration (20 pts)
Before you begin writing a cache side-channel attack, you need to figure out some details about the caches in the system you are running the attack on. Specifically, you need to figure out the cache hit and miss times (cycles).
- Use the calibration.c to write your code that prints out the cache hit and miss latencies. It is important that the output is in the exact format hit_time,miss_time. For example, if hit latency is 100 cycles and miss latency is 500 cycles, then the output of your program should be 100,500.
- To calculate the average hit latency, access a cache block so that it is brought into the cache. Now measure the time to re-access that block. Repeat this experiment for all the sets in the cache and calculate the average.
- To calculate the average miss latency, flush a cache block so that it is removed completely from all the caches. Measure the time to access this block. Repeat the experiment for different sets in the cache and calculate the average.
Part B: Flush Reload attack (50 pts)
In this part of the assignment, you will write a side-channel attack code that uses the Flush+Reload technique to learn about some secrets being accessed by a toy victim process.
You will use the hit and miss latencies that were determined using the calibration program in Part A.
Victim’s Description:
The victim program (victim.c) reads a Records.csv file containing information about some employees. The victim.c takes a list of indices as inputs. These indices correspond to employees who are receiving a promotion. The victim accesses rows of the Records.csv file corresponding to the input indices to obtain details of the employees.
Attack Description:
As an attacker, your goal is to use figure out the employees who are receiving a promotion. In other words, you should determine the indices the victim is trying to access. You have access to the Records.csv file which means that this file is shared between the victim and you. Use the Flush+Reload technique to monitor the lines accessed by the victim. You should use the hit and miss times (should be passed as a comma-separated argument to attack.c) calculated in part A to assist you in the attack.
Note:
- We recommend that you do not edit the victim.c because we would be testing your solutions on the unmodified version of victim.c. If it helps, you can edit while you are building your solution but make sure that your final solution would work on an unmodified victim.c
- Do not hard code the values of hit and miss latencies in your attack. These values can vary across machines.
Running the attack:
1. Open a terminal and run the attack: ./attack $(./calibration)
Open another terminal and run the victim: ./victim 3 2 4 5 (Or something similar)
OR
2. Run the attack and victim together:
./victim N indices… & ./attack $(./calibration)
3. The attack needs to run forever. You could use a Keyboard Interrupt (Ctrl+C) to terminate the attack program after the victim has finished execution.
Output Format:
1. The output of calibration.c should be as follows: hit_time,miss_time
Example: 80,400
2. The output of the attack.c should be the list of indices with each index printed on a new line. Here’s an example:
./victim 2 12 43 & ./attack $(./calibration)
Expected output:
12
43
Pseudocode:
To help you out here’s pseudocode for the attack:
while(1):
For each set in cache_sets:
Do this multiple times:
Monitor the access time of the block
If access time is less than cache hit threshold:
Take note
Determine the set with highest cache hits
Print the index corresponding to the determined block
Part C: Questions (30 pts)
Prime+Probe:
- If you were to carry out an attack similar to the one described in Part B but using Prime+Probe technique, would it be easier or harder than the Flush+Reload method? Why?
- How does the cache organisation (number of levels, cache size) affect Prime+Probe attack? Is that any different from Flush+Reload?
Spectre and Meltdown:
- Between Spectre and Meltdown attacks, which one is closer to be a covert channel, and why?
- Which of the two attacks do you think is stronger? Why?
- Linux released a patch with a feature called KPTI (Kernel Page Table Isolation) to defend against one of these attacks. Which one?
Submission:
You need to submit:
- The source code for calibration.c and attack.c
- ID: this includes your partner's and your netIDs and names.
- solutions.txt: This file should explain the calibration procedure and the attack. Also briefly talk about your implementation of the Flush+Reload attack. If you don't explain, you won't get full credits even if your code works. This file should also include the answers to questions in Part C.
You should compress all the files into one zip file. As a team, only one person should submit the homework.
Rubric
Criteria | Ratings | Pts |
---|---|---|
PartA readme
threshold:
pts
|
pts
--
|
|
PartA calibration works
threshold:
pts
|
pts
--
|
|
PartB readme
threshold:
pts
|
pts
--
|
|
PartB attack works
threshold:
pts
|
pts
--
|
|
PartC q1
threshold:
pts
|
pts
--
|
|
PartC q2
threshold:
pts
|
pts
--
|