#!/bin/bash # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. CROS_LOG_PREFIX=${0##*/} SCRIPT_ROOT=$(dirname "$(readlink -f "$0")") . "${SCRIPT_ROOT}/build_library/build_common.sh" || exit 1 # Developer-visible flags. DEFINE_string board "${DEFAULT_BOARD}" \ "The board to build an image for." DEFINE_string image "" \ "Source release image to use (${CHROMEOS_RECOVERY_IMAGE_NAME} by default)." DEFINE_string baselines "" \ "Directory to load security baselines from (default from cros-signing)" FLAGS_HELP="USAGE: security_test_image [flags] This script is used to run security tests on a Chrome OS images. Note: You probably will need an internal checkout by default for these tests to be useful. You can provide your own baselines, but you can certainly provide your own set of configs. Note: These tests will fail on dev images. They are designed to check recovery images only. " show_help_if_requested "$@" # Parse command line. FLAGS "$@" || exit 1 eval set -- "${FLAGS_ARGV}" # Only now can we die on error. shflags functions leak non-zero error codes, # so will die prematurely if 'switch_to_strict_mode' is specified before now. switch_to_strict_mode SIGNER_DIR="${CHROOT_TRUNK_DIR}/cros-signing" SIGNING_TOOLS_DIR="${SIGNER_DIR}/signer/signingtools-bin" SECURITY_BASELINE_DIR="${SIGNER_DIR}/security_test_baselines" VBOOT_DIR="${CHROOT_TRUNK_DIR}/src/platform/vboot_reference/scripts/"\ "image_signing" # No security baselines provided. Use the standard one. if [[ -z ${FLAGS_baselines} ]]; then FLAGS_baselines=${SECURITY_BASELINE_DIR} if [[ ! -d ${FLAGS_baselines} ]]; then if [[ ! -d ${SIGNER_DIR} ]]; then warn "Skipping security tests with public manifest" exit 0 else die "Could not locate security baselines from" \ "${FLAGS_baselines} with private manifest" fi fi fi info "Loading baselines from ${FLAGS_baselines}" # No image was provided. Use the standard latest image. if [[ -z ${FLAGS_image} ]]; then DEFAULT_IMAGE_DIR=$("${SCRIPT_ROOT}"/get_latest_image.sh \ --board="${FLAGS_board}") FLAGS_image="${DEFAULT_IMAGE_DIR}/${CHROMEOS_RECOVERY_IMAGE_NAME}" fi info "Using ${FLAGS_image}" # The signer uses these binaries, so we should too. PATH="${SIGNING_TOOLS_DIR}:${PATH}" # Run all the security tests. failed_count=0 run_check() { local cmd=( "${VBOOT_DIR}/ensure_$1.sh" "${FLAGS_image}" ) if [[ $# -ge 2 ]]; then cmd+=( "${FLAGS_baselines}/ensure_$1.config" ) fi info "Running ensure_$1.sh" if ! "${cmd[@]}"; then error "$1: test failed" : $(( ++failed_count )) fi } sec_checks=( no_nonrelease_files sane_lsb-release secure_kernelparams ) for check in "${sec_checks[@]}"; do run_check "${check}" "${check}" done sec_checks=( not_ASAN # This test requires an update key to be inserted # first which the signer itself currently does. #update_verification ) for check in "${sec_checks[@]}"; do run_check "${check}" done if [[ ${failed_count} -gt 0 ]]; then die_notrace "${failed_count} tests failed" else info "All tests passed!" fi