fakemurk-daemon.sh 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. #!/bin/bash
  2. run_plugin() {
  3. local script=$1
  4. while true; do
  5. bash "$script"
  6. done & disown
  7. }
  8. get_largest_nvme_namespace() {
  9. # this function doesn't exist if the version is old enough, so we redefine it
  10. local largest size tmp_size dev
  11. size=0
  12. dev=$(basename "$1")
  13. for nvme in /sys/block/"${dev%n*}"*; do
  14. tmp_size=$(cat "${nvme}"/size)
  15. if [ "${tmp_size}" -gt "${size}" ]; then
  16. largest="${nvme##*/}"
  17. size="${tmp_size}"
  18. fi
  19. done
  20. echo "${largest}"
  21. }
  22. doas() {
  23. ssh -t -p 1337 -i /rootkey -oStrictHostKeyChecking=no root@127.0.0.1 "$@"
  24. }
  25. lsbval() {
  26. local key="$1"
  27. local lsbfile="${2:-/etc/lsb-release}"
  28. if ! echo "${key}" | grep -Eq '^[a-zA-Z0-9_]+$'; then
  29. return 1
  30. fi
  31. sed -E -n -e \
  32. "/^[[:space:]]*${key}[[:space:]]*=/{
  33. s:^[^=]+=[[:space:]]*::
  34. s:[[:space:]]+$::
  35. p
  36. }" "${lsbfile}"
  37. }
  38. get_booted_kernnum() {
  39. if doas "((\$(cgpt show -n \"$dst\" -i 2 -P) > \$(cgpt show -n \"$dst\" -i 4 -P)))"; then
  40. echo -n 2
  41. else
  42. echo -n 4
  43. fi
  44. }
  45. opposite_num() {
  46. if [ "$1" == "2" ]; then
  47. echo -n 4
  48. elif [ "$1" == "4" ]; then
  49. echo -n 2
  50. elif [ "$1" == "3" ]; then
  51. echo -n 5
  52. elif [ "$1" == "5" ]; then
  53. echo -n 3
  54. else
  55. return 1
  56. fi
  57. }
  58. {
  59. until tpm_manager_client take_ownership; do
  60. echo "Failed to take ownership of TPM!"
  61. sleep 0.5
  62. done
  63. {
  64. launch_racer(){
  65. echo launching racer at "$(date)"
  66. {
  67. while true; do
  68. cryptohome --action=remove_firmware_management_parameters >/dev/null 2>&1
  69. done
  70. } &
  71. RACERPID=$!
  72. }
  73. launch_racer
  74. while true; do
  75. echo "checking cryptohome status"
  76. if [ "$(cryptohome --action=is_mounted)" == "true" ]; then
  77. if ! [ -z $RACERPID ]; then
  78. echo "Logged in, waiting to kill racer..."
  79. sleep 60
  80. kill -9 $RACERPID
  81. echo "Racer terminated at $(date)"
  82. RACERPID=
  83. fi
  84. else
  85. if [ -z $RACERPID ]; then
  86. launch_racer
  87. fi
  88. fi
  89. sleep 10
  90. done
  91. } &
  92. {
  93. while true; do
  94. vpd -i RW_VPD -s check_enrollment=0 >/dev/null 2>&1
  95. vpd -i RW_VPD -s block_devmode=0 >/dev/null 2>&1
  96. crossystem.old block_devmode=0 >/dev/null 2>&1
  97. sleep 60
  98. done
  99. } &
  100. } &
  101. {
  102. while true; do
  103. if test -d "/home/chronos/user/Downloads/disable-extensions"; then
  104. kill -9 $(pgrep -f "\-\-extension\-process") 2>/dev/null
  105. sleep 0.5
  106. else
  107. sleep 5
  108. fi
  109. done
  110. } &
  111. {
  112. while true; do
  113. if test -d "/home/chronos/user/Downloads/fix-mush"; then
  114. cat << 'EOF' > /usr/bin/crosh
  115. mush_info() {
  116. echo "This is an emergency backup shell! If you triggered this accidentally, type the following command at the prompt:"
  117. echo "bash <(curl -SLk https://raw.githubusercontent.com/rainestorme/murkmod/main/murkmod.sh)"
  118. }
  119. doas() {
  120. ssh -t -p 1337 -i /rootkey -oStrictHostKeyChecking=no root@127.0.0.1 "$@"
  121. }
  122. runjob() {
  123. trap 'kill -2 $! >/dev/null 2>&1' INT
  124. (
  125. # shellcheck disable=SC2068
  126. $@
  127. )
  128. trap '' INT
  129. }
  130. mush_info
  131. runjob doas "bash"
  132. EOF
  133. sleep 10
  134. else
  135. sleep 5
  136. fi
  137. done
  138. } &
  139. {
  140. # technically this should go in chromeos_startup.sh but it would slow down the boot process
  141. echo "Waiting for boot on emergency restore (just in case)"
  142. sleep 60
  143. echo "Checking for restore flag..."
  144. if [ -f /restore-emergency-backup ]; then
  145. echo "Restore flag found!"
  146. echo "Looking for backup files..."
  147. dst=/dev/$(get_largest_nvme_namespace)
  148. tgt_kern=$(opposite_num $(get_booted_kernnum))
  149. tgt_root=$(( $tgt_kern + 1 ))
  150. kerndev=${dst}p${tgt_kern}
  151. rootdev=${dst}p${tgt_root}
  152. if [ -f /mnt/stateful_partition/murkmod/kern_backup.img ] && [ -f /mnt/stateful_partition/murkmod/root_backup.img ]; then
  153. echo "Backup files found!"
  154. echo "Restoring kernel..."
  155. dd if=/mnt/stateful_partition/murkmod/kern_backup.img of=$kerndev bs=4M status=progress
  156. echo "Restoring rootfs..."
  157. dd if=/mnt/stateful_partition/murkmod/root_backup.img of=$rootdev bs=4M status=progress
  158. echo "Removing restore flag..."
  159. rm /restore-emergency-backup
  160. echo "Removing backup files..."
  161. rm /mnt/stateful_partition/murkmod/kern_backup.img
  162. rm /mnt/stateful_partition/murkmod/root_backup.img
  163. echo "Restored successfully!"
  164. else
  165. echo "Missing backup image, removing restore flag and aborting!"
  166. rm /restore-emergency-backup
  167. fi
  168. else
  169. echo "No need to restore."
  170. fi
  171. } &
  172. {
  173. echo "Witing for boot on daemon plugins (also just in case)"
  174. sleep 60
  175. echo "Finding daemon plugins..."
  176. for file in /mnt/stateful_partition/murkmod/plugins/*.sh; do
  177. if grep -q "daemon_plugin" "$file"; then
  178. echo "Spawning plugin $file..."
  179. run_plugin $file
  180. fi
  181. done
  182. } &