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