xref: /xnu-11417.101.15/san/tools/kasan_install (revision e3723e1f17661b24996789d8afc084c0c3303b26)
1*e3723e1fSApple OSS Distributions#!/bin/bash
2*e3723e1fSApple OSS Distributions
3*e3723e1fSApple OSS Distributions#
4*e3723e1fSApple OSS Distributions# kasan_install: set up a system to run the KASan kernel. Run with "--uninstall"
5*e3723e1fSApple OSS Distributions# to reverse the setup.
6*e3723e1fSApple OSS Distributions#
7*e3723e1fSApple OSS Distributions# Adds kcsuffix=kasan to boot-args.
8*e3723e1fSApple OSS Distributions#
9*e3723e1fSApple OSS Distributions
10*e3723e1fSApple OSS Distributions
11*e3723e1fSApple OSS Distributionsif [[ `whoami` != root ]] ; then
12*e3723e1fSApple OSS Distributions	echo "Re-running with sudo"
13*e3723e1fSApple OSS Distributions	sudo "$0" "$@"
14*e3723e1fSApple OSS Distributions	exit $?
15*e3723e1fSApple OSS Distributionsfi
16*e3723e1fSApple OSS Distributions
17*e3723e1fSApple OSS Distributionssip_enabled() {
18*e3723e1fSApple OSS Distributions	csrutil status |grep -q enabled
19*e3723e1fSApple OSS Distributions}
20*e3723e1fSApple OSS Distributions
21*e3723e1fSApple OSS Distributionsprompt() {
22*e3723e1fSApple OSS Distributions	echo -n "$@ [y/N] "
23*e3723e1fSApple OSS Distributions	read ans
24*e3723e1fSApple OSS Distributions	case "$ans" in
25*e3723e1fSApple OSS Distributions		[yY]*) return 0 ;;
26*e3723e1fSApple OSS Distributions		*) return 1 ;;
27*e3723e1fSApple OSS Distributions	esac
28*e3723e1fSApple OSS Distributions}
29*e3723e1fSApple OSS Distributions
30*e3723e1fSApple OSS Distributionskasan_install() {
31*e3723e1fSApple OSS Distributions
32*e3723e1fSApple OSS Distributions	dobootargs=0
33*e3723e1fSApple OSS Distributions
34*e3723e1fSApple OSS Distributions	echo -n "Checking KASan boot args... "
35*e3723e1fSApple OSS Distributions
36*e3723e1fSApple OSS Distributions	bootargs=$(nvram boot-args | cut -f2)
37*e3723e1fSApple OSS Distributions	cursuffix=$(echo $bootargs | sed -n 's/.*kcsuffix=\([^ ]\)/\1/p')
38*e3723e1fSApple OSS Distributions
39*e3723e1fSApple OSS Distributions	if [[ "$cursuffix" == kasan ]] ; then
40*e3723e1fSApple OSS Distributions		echo "already set."
41*e3723e1fSApple OSS Distributions	elif [[ -n "$cursuffix" ]] ; then
42*e3723e1fSApple OSS Distributions		prompt "custom kcsuffix ($cursuffix) is set. Overwrite?" && {
43*e3723e1fSApple OSS Distributions			bootargs=$(echo "$bootargs" | sed 's/[ ]*kcsuffix=[^ ]*//')
44*e3723e1fSApple OSS Distributions			dobootargs=1
45*e3723e1fSApple OSS Distributions		}
46*e3723e1fSApple OSS Distributions	else
47*e3723e1fSApple OSS Distributions		prompt "not set. Modify?" && {
48*e3723e1fSApple OSS Distributions			dobootargs=1
49*e3723e1fSApple OSS Distributions		}
50*e3723e1fSApple OSS Distributions	fi
51*e3723e1fSApple OSS Distributions
52*e3723e1fSApple OSS Distributions	[[ $dobootargs -eq 1 ]] && {
53*e3723e1fSApple OSS Distributions		echo -n "Adding boot arg kcsuffix=kasan... "
54*e3723e1fSApple OSS Distributions		newlen=$(echo -n "$bootargs kcsuffix=kasan" |wc -c)
55*e3723e1fSApple OSS Distributions		if [[ $newlen -ge 512 ]] ; then
56*e3723e1fSApple OSS Distributions			echo "boot-args too long. Bailing."
57*e3723e1fSApple OSS Distributions			exit 3
58*e3723e1fSApple OSS Distributions		fi
59*e3723e1fSApple OSS Distributions
60*e3723e1fSApple OSS Distributions		nvram boot-args="$bootargs kcsuffix=kasan" || exit $?
61*e3723e1fSApple OSS Distributions		echo "done."
62*e3723e1fSApple OSS Distributions	}
63*e3723e1fSApple OSS Distributions
64*e3723e1fSApple OSS Distributions}
65*e3723e1fSApple OSS Distributions
66*e3723e1fSApple OSS Distributions
67*e3723e1fSApple OSS Distributionskasan_uninstall() {
68*e3723e1fSApple OSS Distributions
69*e3723e1fSApple OSS Distributions	echo -n "Removing boot args... "
70*e3723e1fSApple OSS Distributions
71*e3723e1fSApple OSS Distributions	bootargs=$(nvram boot-args | cut -f2)
72*e3723e1fSApple OSS Distributions	cursuffix=$(echo $bootargs | sed -n 's/.*kcsuffix=\([^ ]\)/\1/p')
73*e3723e1fSApple OSS Distributions
74*e3723e1fSApple OSS Distributions	if [[ $cursuffix == "kasan" ]] ; then
75*e3723e1fSApple OSS Distributions		prompt "remove kcsuffix=kasan?" && {
76*e3723e1fSApple OSS Distributions			echo -n "Removing kcsuffix... "
77*e3723e1fSApple OSS Distributions			bootargs=$(echo "$bootargs" | sed 's/[ ]*kcsuffix=[^ ]*//')
78*e3723e1fSApple OSS Distributions			nvram boot-args="$bootargs"
79*e3723e1fSApple OSS Distributions			echo "done."
80*e3723e1fSApple OSS Distributions		}
81*e3723e1fSApple OSS Distributions	else
82*e3723e1fSApple OSS Distributions		echo "not set."
83*e3723e1fSApple OSS Distributions	fi
84*e3723e1fSApple OSS Distributions
85*e3723e1fSApple OSS Distributions}
86*e3723e1fSApple OSS Distributions
87*e3723e1fSApple OSS Distributionscase "$1" in
88*e3723e1fSApple OSS Distributions	*uninstall|*del*|*remove|*rm)
89*e3723e1fSApple OSS Distributions		kasan_uninstall ;;
90*e3723e1fSApple OSS Distributions	*)
91*e3723e1fSApple OSS Distributions		kasan_install ;;
92*e3723e1fSApple OSS Distributionsesac
93