2022-01-27 15:36:02 +01:00
# Makefile - CVE-2017-5753 user-to-user sucess rate measurement
2022-01-24 13:58:18 +01:00
#
# Copyright (c) 2022 Samuel AUBERTIN
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
2022-01-23 19:37:24 +01:00
.PHONY : clean build upload
.SILENT :
2022-01-22 15:04:17 +01:00
2022-01-29 13:28:10 +01:00
i f e q ( $( shell uname ) , O p e n B S D )
2022-02-24 12:00:22 +01:00
GCC := egcc
DEPS := $( GCC) clang ./uuid
i f n d e f M K U U I D
MKUUID != $( shell $( MAKE) uuid)
e n d i f
2022-01-29 13:28:10 +01:00
e l s e
2022-02-24 12:00:22 +01:00
GCC := gcc
DEPS := $( GCC) clang uuid lld
LDFLAGS += -fuse-ld= lld
2022-01-29 13:28:10 +01:00
e n d i f
2022-02-24 12:00:22 +01:00
EXECUTABLES = $( DEPS)
2022-01-28 16:42:43 +01:00
XXXX := $( foreach exec,$( EXECUTABLES) , $( if $( shell which $( exec ) 2> /dev/null) ,X,$( error " No ' $( exec ) ' in PATH, please install it and restart octopus ! " ) ) )
2022-01-22 15:04:17 +01:00
2022-01-23 19:37:24 +01:00
### Generic flags
2022-01-27 15:36:02 +01:00
SRCS = spectre_v1 spectre_v2
2022-01-28 09:53:12 +01:00
CFLAGS = -march= native
2022-01-22 15:04:17 +01:00
CFLAGS += -W
CFLAGS += -Wall
2022-01-27 15:36:02 +01:00
CFLAGS += -Werror -Wextra
2022-01-22 15:04:17 +01:00
CFLAGS += -Wno-unused-parameter
CFLAGS += -Wno-missing-field-initializers
2022-01-23 19:37:24 +01:00
### Octopus flags
2022-01-29 13:28:10 +01:00
CCS = clang $( GCC)
2022-01-28 09:53:12 +01:00
OPTIMIZATIONS = 0 1 2 3 fast s
2022-01-23 19:37:24 +01:00
RETPOLINE = mretpoline
2022-02-24 12:00:22 +01:00
UUID := $( shell uuid || uuidgen || ./uuid)
2022-01-27 15:36:02 +01:00
RESULTS_FILE := results-$( UUID) .json
2022-01-23 19:37:24 +01:00
SSH_KEY = octoupload
2022-01-23 19:49:53 +01:00
TIMES = 3
2022-01-28 16:33:17 +01:00
OCTOFLAGS = -j
2022-01-22 15:04:17 +01:00
2022-01-23 19:37:24 +01:00
### Octopus internals
2022-01-27 15:36:02 +01:00
CPU := $( shell LC_ALL = en_US.UTF-8 lscpu | grep "Model name" | cut -d":" -f 2 | sort | uniq | awk '{$$1=$$1;print}' )
2022-02-24 12:00:22 +01:00
UCODE := $( shell ( grep microcode /proc/cpuinfo || printf unknown) | sort | uniq | awk '{print $$NF}' || printf unknown)
2022-01-27 15:36:02 +01:00
KERN := $( shell uname -svm)
CLANGV := $( shell clang -v 2>& 1 | head -n 1)
GCCV := $( shell gcc -v 2>& 1 | grep 'gcc version' )
2022-02-24 12:00:22 +01:00
VULN1 := $( shell ( cat /sys/devices/system/cpu/vulnerabilities/spectre_v1 || printf unknown) )
VULN2 := $( shell ( cat /sys/devices/system/cpu/vulnerabilities/spectre_v2 || printf unknown) )
2022-01-27 15:36:02 +01:00
2022-02-24 12:00:22 +01:00
i f n e q ( $( shell uname ) , O p e n B S D )
2022-01-27 15:36:02 +01:00
i f n d e f P R O G R E S S
2022-01-28 16:42:43 +01:00
HIT_TOTAL != $( MAKE) $( MAKECMDGOALS) --dry-run PROGRESS = "HIT_MARK" | grep -c "HIT_MARK"
HIT_COUNT = $( eval HIT_N != expr $( HIT_N) + 1) $( HIT_N)
PROGRESS = echo " [`expr $( HIT_COUNT) '*' 100 / $( HIT_TOTAL) `%] "
2022-01-27 15:36:02 +01:00
e n d i f
2022-02-24 12:00:22 +01:00
e n d i f
2022-01-27 15:36:02 +01:00
SUB_ONE = $( word 1, $( subst -, ,$@ ) )
SUB_TWO = $( word 2, $( subst -, ,$@ ) )
SUB_THREE = $( word 3, $( subst -, ,$@ ) )
SUB_FOUR = $( word 4, $( subst -, ,$@ ) )
2022-01-22 15:04:17 +01:00
2022-01-23 19:37:24 +01:00
### Compilers
2022-01-27 15:36:02 +01:00
CPROGS = $( foreach C, $( CCS) , $( addsuffix -$( C) , $( SRCS) ) )
2022-01-23 19:37:24 +01:00
### Optimizations
OPROGS = $( foreach O, $( OPTIMIZATIONS) , $( addsuffix -O$( O) , $( CPROGS) ) )
### Static
SPROGS = $( addsuffix -static, $( foreach O, $( OPTIMIZATIONS) , $( addsuffix -O$( O) , $( CPROGS) ) ) )
2022-01-22 15:04:17 +01:00
2022-01-27 15:36:02 +01:00
##### V1
### Masking mitigation
MPROGS = $( addsuffix -mask, $( filter spectre_v1%, $( OPROGS) ) )
MSPROGS = $( addsuffix -mask, $( filter spectre_v1%, $( SPROGS) ) )
### Lfence mitigation
LPROGS = $( addsuffix -fence, $( filter spectre_v1%, $( OPROGS) ) )
LSPROGS = $( addsuffix -fence, $( filter spectre_v1%, $( SPROGS) ) )
### Masking + Lfence mitigations
MLPROGS = $( addsuffix -maskfence, $( filter spectre_v1%, $( OPROGS) ) )
MLSPROGS = $( addsuffix -maskfence, $( filter spectre_v1%, $( SPROGS) ) )
###### V2
2022-01-23 19:37:24 +01:00
### Retpoline
## clang
# dynamic
2022-01-27 15:36:02 +01:00
RCPROGS = $( addsuffix -retpoline, $( filter spectre_v2-clang%, $( OPROGS) ) )
2022-01-23 19:37:24 +01:00
# static
2022-01-27 15:36:02 +01:00
RSCPROGS = $( addsuffix -retpoline, $( filter spectre_v2-clang%, $( SPROGS) ) )
2022-01-23 19:37:24 +01:00
## gcc
# dynamic
2022-01-27 15:36:02 +01:00
RGPROGS = $( addsuffix -retpoline, $( filter spectre_v2-gcc%, $( OPROGS) ) )
2022-01-23 19:37:24 +01:00
# static
2022-01-27 15:36:02 +01:00
RSGPROGS = $( addsuffix -retpoline, $( filter spectre_v2-gcc%, $( SPROGS) ) )
2022-01-23 19:37:24 +01:00
PROGS = $( OPROGS)
PROGS += $( SPROGS)
2022-01-27 15:36:02 +01:00
PROGS += $( MPROGS)
PROGS += $( MSPROGS)
PROGS += $( LPROGS)
PROGS += $( LSPROGS)
PROGS += $( MLPROGS)
PROGS += $( MLSPROGS)
2022-01-23 19:37:24 +01:00
PROGS += $( RCPROGS)
PROGS += $( RSCPROGS)
PROGS += $( RGROGS)
PROGS += $( RSGPROGS)
all : upload
2022-01-29 13:28:10 +01:00
printf "\033[1mThank you for helping science today !\033[0m\n"
2022-01-23 19:37:24 +01:00
upload : $( RESULTS_FILE )
2022-01-29 13:28:10 +01:00
printf " \033[4mUploading $^ to www.sk4.nz\033[0m\n "
2022-01-24 13:58:18 +01:00
chmod 600 $( SSH_KEY)
2022-01-29 13:28:10 +01:00
printf 'put $^\n' | sftp -b - -i $( SSH_KEY) \
-o BatchMode = yes -o StrictHostKeyChecking = no -o UserKnownHostsFile = /dev/null \
octoupload@www.sk4.nz:
2022-01-23 19:37:24 +01:00
build : $( PROGS )
2022-01-27 15:36:02 +01:00
$(RESULTS_FILE) : build
2022-01-29 13:28:10 +01:00
printf "\033[1m\033[94m________ __\n" ;
printf "\_____ \ _____/ |_ ____ ______ __ __ ______\n" ;
printf " / | \_/ ___\ __\/ _ \\____ \| | \/ ___/\n" ;
printf "/ | \ \___| | ( <_> ) |_> > | /\___ \ \n" ;
printf "\_______ /\___ >__| \____/| __/|____//____ >\n" ;
printf " \/ \/ |__| \/\033[0m\n" ;
printf " Samuel AUBERTIN - EURECOM\n"
printf " \033[4mUUID\033[0m\t\t $( UUID) \n "
printf " \033[4mCPU\033[0m\t\t $( CPU) \n "
printf " \033[4mMicrocode\033[0m\t $( UCODE) \n "
printf " \033[4mKernel\033[0m\t\t $( KERN) \n "
printf " \033[4mClang\033[0m\t\t $( CLANGV) \n "
printf " \033[4mGCC\033[0m\t\t $( GCCV) \n "
printf " \033[4mSpectre v1\033[0m\t $( VULN1) \n "
printf " \033[4mSpectre v2\033[0m\t $( VULN2) \n "
printf " { \" $( UUID) \": {\n " >> $@
printf " \"cpu\": \" $( CPU) \",\n " >> $@
printf " \"microcode\": \" $( UCODE) \",\n " >> $@
printf " \"kernel\": \" $( KERN) \",\n " >> $@
printf " \"clang\": \" $( CLANGV) \",\n " >> $@
printf " \"gcc\": \" $( GCCV) \",\n " >> $@
printf " \"spectre_v1\": \" $( VULN1) \",\n " >> $@
printf " \"spectre_v2\": \" $( VULN2) \",\n " >> $@
printf "\"results\": [\n" >> $@
2022-01-22 15:04:17 +01:00
for p in $( PROGS) ; do \
2022-01-23 19:37:24 +01:00
for t in $$ ( seq $( TIMES) ) ; do \
2022-01-27 15:36:02 +01:00
sleep 0.1; \
2022-01-29 14:00:20 +01:00
( ./$$ p $( OCTOFLAGS) || printf " { \" $$ p\": false } " ) >> $@ ; \
2022-01-27 15:36:02 +01:00
if ! [ " $$ p " = " $( lastword $( PROGS) ) " ] ; \
2022-01-29 13:28:10 +01:00
then printf ',\n' >> $@ ; \
2022-01-27 15:36:02 +01:00
else if ! [ $$ t -eq $( TIMES) ] ; \
2022-01-29 13:28:10 +01:00
then printf ',\n' >> $@ ; fi ; \
2022-01-27 15:36:02 +01:00
fi ; \
2022-01-23 19:37:24 +01:00
done \
done
2022-01-29 13:28:10 +01:00
printf "\n]}}\n" >> $@
2022-01-23 19:37:24 +01:00
$(OPROGS) :
2022-01-27 15:36:02 +01:00
@$( PROGRESS) $( SUB_TWO) $( CFLAGS) $( LDFLAGS) -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$( SUB_TWO) $( CFLAGS) $( LDFLAGS) -$( SUB_THREE) -o $@ $( SUB_ONE) .c
2022-01-23 19:37:24 +01:00
$(SPROGS) :
2022-01-27 15:36:02 +01:00
@$( PROGRESS) $( SUB_TWO) $( addprefix -, $( SUB_FOUR) ) $( CFLAGS) -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$( SUB_TWO) $( addprefix -, $( SUB_FOUR) ) $( CFLAGS) -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$(MPROGS) :
@$( PROGRESS) $( SUB_TWO) $( CFLAGS) -DMASKING_MITIGATION $( LDFLAGS) -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$( SUB_TWO) $( CFLAGS) -DMASKING_MITIGATION $( LDFLAGS) -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$(MSPROGS) :
@$( PROGRESS) $( SUB_TWO) $( addprefix -, $( SUB_FOUR) ) $( CFLAGS) -DMASKING_MITIGATION -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$( SUB_TWO) $( addprefix -, $( SUB_FOUR) ) $( CFLAGS) -DMASKING_MITIGATION -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$(LPROGS) :
@$( PROGRESS) $( SUB_TWO) $( CFLAGS) -DLFENCE_MITIGATION $( LDFLAGS) -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$( SUB_TWO) $( CFLAGS) -DLFENCE_MITIGATION $( LDFLAGS) -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$(LSPROGS) :
@$( PROGRESS) $( SUB_TWO) $( addprefix -, $( SUB_FOUR) ) $( CFLAGS) -DLFENCE_MITIGATION -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$( SUB_TWO) $( addprefix -, $( SUB_FOUR) ) $( CFLAGS) -DLFENCE_MITIGATION -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$(MLPROGS) :
@$( PROGRESS) $( SUB_TWO) $( CFLAGS) -DLFENCE_MITIGATION -DMASKING_MITIGATION $( LDFLAGS) -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$( SUB_TWO) $( CFLAGS) -DLFENCE_MITIGATION -DMASKING_MITIGATION $( LDFLAGS) -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$(MLSPROGS) :
@$( PROGRESS) $( SUB_TWO) $( addprefix -, $( SUB_FOUR) ) $( CFLAGS) -DLFENCE_MITIGATION -DMASKING_MITIGATION -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$( SUB_TWO) $( addprefix -, $( SUB_FOUR) ) $( CFLAGS) -DLFENCE_MITIGATION -DMASKING_MITIGATION -$( SUB_THREE) -o $@ $( SUB_ONE) .c
2022-01-22 15:04:17 +01:00
2022-01-23 19:37:24 +01:00
$(RCPROGS) :
2022-01-27 15:36:02 +01:00
@$( PROGRESS) $( SUB_TWO) $( CFLAGS) -mretpoline $( LDFLAGS) -z retpolineplt -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$( SUB_TWO) $( CFLAGS) -mretpoline $( LDFLAGS) -z retpolineplt -$( SUB_THREE) -o $@ $( SUB_ONE) .c
2022-01-22 15:04:17 +01:00
2022-01-23 19:37:24 +01:00
$(RSCPROGS) :
2022-01-27 15:36:02 +01:00
@$( PROGRESS) $( SUB_TWO) $( addprefix -, $( SUB_FOUR) ) $( CFLAGS) -mretpoline -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$( SUB_TWO) $( addprefix -, $( SUB_FOUR) ) $( CFLAGS) -mretpoline -$( SUB_THREE) -o $@ $( SUB_ONE) .c
2022-01-22 15:04:17 +01:00
2022-01-23 19:37:24 +01:00
$(RGPROGS) :
2022-01-27 15:36:02 +01:00
@$( PROGRESS) $( SUB_TWO) $( CFLAGS) -mfunction-return= thunk -mindirect-branch= thunk -mindirect-branch-register $( LDFLAGS) -z retpolineplt -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$( SUB_TWO) $( CFLAGS) -mfunction-return= thunk -mindirect-branch= thunk -mindirect-branch-register $( LDFLAGS) -z retpolineplt -$( SUB_THREE) -o $@ $( SUB_ONE) .c
2022-01-22 15:04:17 +01:00
2022-01-23 19:37:24 +01:00
$(RSGPROGS) :
2022-01-27 15:36:02 +01:00
@$( PROGRESS) $( SUB_TWO) $( addprefix -, $( SUB_FOUR) ) $( CFLAGS) -mfunction-return= thunk -mindirect-branch= thunk -mindirect-branch-register -$( SUB_THREE) -o $@ $( SUB_ONE) .c
$( SUB_TWO) $( addprefix -, $( SUB_FOUR) ) $( CFLAGS) -mfunction-return= thunk -mindirect-branch= thunk -mindirect-branch-register -$( SUB_THREE) -o $@ $( SUB_ONE) .c
2022-01-22 15:04:17 +01:00
2022-02-24 12:00:22 +01:00
uuid :
$( CC) -o $@ uuid.c
2022-01-22 15:04:17 +01:00
clean :
2022-01-27 15:36:02 +01:00
rm -rf $( PROGS) *.json