1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <inttypes.h> 18 #include <stdio.h> 19 #include <stdlib.h> 20 #include <string.h> 21 #include <unistd.h> 22 #include <fcntl.h> 23 #include <ctype.h> 24 #include <sys/mount.h> 25 #include <sys/stat.h> 26 #include <errno.h> 27 #include <sys/types.h> 28 #include <sys/wait.h> 29 #include <libgen.h> 30 #include <time.h> 31 32 #include <private/android_filesystem_config.h> 33 #include <cutils/properties.h> 34 #include <logwrap/logwrap.h> 35 36 #include "mincrypt/rsa.h" 37 #include "mincrypt/sha.h" 38 #include "mincrypt/sha256.h" 39 40 #include "ext4_sb.h" 41 #include "squashfs_utils.h" 42 43 #include "fs_mgr_priv.h" 44 #include "fs_mgr_priv_verity.h" 45 46 #define FSTAB_PREFIX "/fstab." 47 48 #define VERITY_METADATA_SIZE 32768 49 #define VERITY_TABLE_RSA_KEY "/verity_key" 50 51 #define METADATA_MAGIC 0x01564c54 52 #define METADATA_TAG_MAX_LENGTH 63 53 #define METADATA_EOD "eod" 54 55 #define VERITY_LASTSIG_TAG "verity_lastsig" 56 57 #define VERITY_STATE_TAG "verity_state" 58 #define VERITY_STATE_HEADER 0x83c0ae9d 59 #define VERITY_STATE_VERSION 1 60 61 #define VERITY_KMSG_RESTART "dm-verity device corrupted" 62 #define VERITY_KMSG_BUFSIZE 1024 63 64 #define __STRINGIFY(x) #x 65 #define STRINGIFY(x) __STRINGIFY(x) 66 67 struct verity_state { 68 uint32_t header; 69 uint32_t version; 70 int32_t mode; 71 }; 72 73 extern struct fs_info info; 74 75 static RSAPublicKey *load_key(char *path) 76 { 77 FILE *f; 78 RSAPublicKey *key; 79 80 key = malloc(sizeof(RSAPublicKey)); 81 if (!key) { 82 ERROR("Can't malloc key\n"); 83 return NULL; 84 } 85 86 f = fopen(path, "r"); 87 if (!f) { 88 ERROR("Can't open '%s'\n", path); 89 free(key); 90 return NULL; 91 } 92 93 if (!fread(key, sizeof(*key), 1, f)) { 94 ERROR("Could not read key!"); 95 fclose(f); 96 free(key); 97 return NULL; 98 } 99 100 if (key->len != RSANUMWORDS) { 101 ERROR("Invalid key length %d\n", key->len); 102 fclose(f); 103 free(key); 104 return NULL; 105 } 106 107 fclose(f); 108 return key; 109 } 110 111 static int verify_table(char *signature, char *table, int table_length) 112 { 113 RSAPublicKey *key; 114 uint8_t hash_buf[SHA256_DIGEST_SIZE]; 115 int retval = -1; 116 117 // Hash the table 118 SHA256_hash((uint8_t*)table, table_length, hash_buf); 119 120 // Now get the public key from the keyfile 121 key = load_key(VERITY_TABLE_RSA_KEY); 122 if (!key) { 123 ERROR("Couldn't load verity keys"); 124 goto out; 125 } 126 127 // verify the result 128 if (!RSA_verify(key, 129 (uint8_t*) signature, 130 RSANUMBYTES, 131 (uint8_t*) hash_buf, 132 SHA256_DIGEST_SIZE)) { 133 ERROR("Couldn't verify table."); 134 goto out; 135 } 136 137 retval = 0; 138 139 out: 140 free(key); 141 return retval; 142 } 143 144 static int squashfs_get_target_device_size(char *blk_device, uint64_t *device_size) 145 { 146 struct squashfs_info sq_info; 147 148 if (squashfs_parse_sb(blk_device, &sq_info) >= 0) { 149 *device_size = sq_info.bytes_used_4K_padded; 150 return 0; 151 } else { 152 return -1; 153 } 154 } 155 156 static int ext4_get_target_device_size(char *blk_device, uint64_t *device_size) 157 { 158 int data_device; 159 struct ext4_super_block sb; 160 struct fs_info info; 161 162 info.len = 0; /* Only len is set to 0 to ask the device for real size. */ 163 164 data_device = TEMP_FAILURE_RETRY(open(blk_device, O_RDONLY | O_CLOEXEC)); 165 if (data_device == -1) { 166 ERROR("Error opening block device (%s)", strerror(errno)); 167 return -1; 168 } 169 170 if (TEMP_FAILURE_RETRY(lseek64(data_device, 1024, SEEK_SET)) < 0) { 171 ERROR("Error seeking to superblock"); 172 close(data_device); 173 return -1; 174 } 175 176 if (TEMP_FAILURE_RETRY(read(data_device, &sb, sizeof(sb))) != sizeof(sb)) { 177 ERROR("Error reading superblock"); 178 close(data_device); 179 return -1; 180 } 181 182 ext4_parse_sb(&sb, &info); 183 *device_size = info.len; 184 185 close(data_device); 186 return 0; 187 } 188 189 static int get_fs_size(char *fs_type, char *blk_device, uint64_t *device_size) { 190 if (!strcmp(fs_type, "ext4")) { 191 if (ext4_get_target_device_size(blk_device, device_size) < 0) { 192 ERROR("Failed to get ext4 fs size on %s.", blk_device); 193 return -1; 194 } 195 } else if (!strcmp(fs_type, "squashfs")) { 196 if (squashfs_get_target_device_size(blk_device, device_size) < 0) { 197 ERROR("Failed to get squashfs fs size on %s.", blk_device); 198 return -1; 199 } 200 } else { 201 ERROR("%s: Unsupported filesystem for verity.", fs_type); 202 return -1; 203 } 204 return 0; 205 } 206 207 static int read_verity_metadata(uint64_t device_size, char *block_device, char **signature, 208 char **table) 209 { 210 unsigned magic_number; 211 unsigned table_length; 212 int protocol_version; 213 int device; 214 int retval = FS_MGR_SETUP_VERITY_FAIL; 215 216 *signature = NULL; 217 218 if (table) { 219 *table = NULL; 220 } 221 222 device = TEMP_FAILURE_RETRY(open(block_device, O_RDONLY | O_CLOEXEC)); 223 if (device == -1) { 224 ERROR("Could not open block device %s (%s).\n", block_device, strerror(errno)); 225 goto out; 226 } 227 228 if (TEMP_FAILURE_RETRY(lseek64(device, device_size, SEEK_SET)) < 0) { 229 ERROR("Could not seek to start of verity metadata block.\n"); 230 goto out; 231 } 232 233 // check the magic number 234 if (TEMP_FAILURE_RETRY(read(device, &magic_number, sizeof(magic_number))) != 235 sizeof(magic_number)) { 236 ERROR("Couldn't read magic number!\n"); 237 goto out; 238 } 239 240 #ifdef ALLOW_ADBD_DISABLE_VERITY 241 if (magic_number == VERITY_METADATA_MAGIC_DISABLE) { 242 retval = FS_MGR_SETUP_VERITY_DISABLED; 243 INFO("Attempt to cleanly disable verity - only works in USERDEBUG"); 244 goto out; 245 } 246 #endif 247 248 if (magic_number != VERITY_METADATA_MAGIC_NUMBER) { 249 ERROR("Couldn't find verity metadata at offset %"PRIu64"!\n", device_size); 250 goto out; 251 } 252 253 // check the protocol version 254 if (TEMP_FAILURE_RETRY(read(device, &protocol_version, 255 sizeof(protocol_version))) != sizeof(protocol_version)) { 256 ERROR("Couldn't read verity metadata protocol version!\n"); 257 goto out; 258 } 259 if (protocol_version != 0) { 260 ERROR("Got unknown verity metadata protocol version %d!\n", protocol_version); 261 goto out; 262 } 263 264 // get the signature 265 *signature = (char*) malloc(RSANUMBYTES); 266 if (!*signature) { 267 ERROR("Couldn't allocate memory for signature!\n"); 268 goto out; 269 } 270 if (TEMP_FAILURE_RETRY(read(device, *signature, RSANUMBYTES)) != RSANUMBYTES) { 271 ERROR("Couldn't read signature from verity metadata!\n"); 272 goto out; 273 } 274 275 if (!table) { 276 retval = FS_MGR_SETUP_VERITY_SUCCESS; 277 goto out; 278 } 279 280 // get the size of the table 281 if (TEMP_FAILURE_RETRY(read(device, &table_length, sizeof(table_length))) != 282 sizeof(table_length)) { 283 ERROR("Couldn't get the size of the verity table from metadata!\n"); 284 goto out; 285 } 286 287 // get the table + null terminator 288 *table = malloc(table_length + 1); 289 if (!*table) { 290 ERROR("Couldn't allocate memory for verity table!\n"); 291 goto out; 292 } 293 if (TEMP_FAILURE_RETRY(read(device, *table, table_length)) != 294 (ssize_t)table_length) { 295 ERROR("Couldn't read the verity table from metadata!\n"); 296 goto out; 297 } 298 299 (*table)[table_length] = 0; 300 retval = FS_MGR_SETUP_VERITY_SUCCESS; 301 302 out: 303 if (device != -1) 304 close(device); 305 306 if (retval != FS_MGR_SETUP_VERITY_SUCCESS) { 307 free(*signature); 308 *signature = NULL; 309 310 if (table) { 311 free(*table); 312 *table = NULL; 313 } 314 } 315 316 return retval; 317 } 318 319 static void verity_ioctl_init(struct dm_ioctl *io, char *name, unsigned flags) 320 { 321 memset(io, 0, DM_BUF_SIZE); 322 io->data_size = DM_BUF_SIZE; 323 io->data_start = sizeof(struct dm_ioctl); 324 io->version[0] = 4; 325 io->version[1] = 0; 326 io->version[2] = 0; 327 io->flags = flags | DM_READONLY_FLAG; 328 if (name) { 329 strlcpy(io->name, name, sizeof(io->name)); 330 } 331 } 332 333 static int create_verity_device(struct dm_ioctl *io, char *name, int fd) 334 { 335 verity_ioctl_init(io, name, 1); 336 if (ioctl(fd, DM_DEV_CREATE, io)) { 337 ERROR("Error creating device mapping (%s)", strerror(errno)); 338 return -1; 339 } 340 return 0; 341 } 342 343 static int get_verity_device_name(struct dm_ioctl *io, char *name, int fd, char **dev_name) 344 { 345 verity_ioctl_init(io, name, 0); 346 if (ioctl(fd, DM_DEV_STATUS, io)) { 347 ERROR("Error fetching verity device number (%s)", strerror(errno)); 348 return -1; 349 } 350 int dev_num = (io->dev & 0xff) | ((io->dev >> 12) & 0xfff00); 351 if (asprintf(dev_name, "/dev/block/dm-%u", dev_num) < 0) { 352 ERROR("Error getting verity block device name (%s)", strerror(errno)); 353 return -1; 354 } 355 return 0; 356 } 357 358 static int load_verity_table(struct dm_ioctl *io, char *name, uint64_t device_size, int fd, char *table, 359 int mode) 360 { 361 char *verity_params; 362 char *buffer = (char*) io; 363 size_t bufsize; 364 365 verity_ioctl_init(io, name, DM_STATUS_TABLE_FLAG); 366 367 struct dm_target_spec *tgt = (struct dm_target_spec *) &buffer[sizeof(struct dm_ioctl)]; 368 369 // set tgt arguments here 370 io->target_count = 1; 371 tgt->status=0; 372 tgt->sector_start=0; 373 tgt->length=device_size/512; 374 strcpy(tgt->target_type, "verity"); 375 376 // build the verity params here 377 verity_params = buffer + sizeof(struct dm_ioctl) + sizeof(struct dm_target_spec); 378 bufsize = DM_BUF_SIZE - (verity_params - buffer); 379 380 if (mode == VERITY_MODE_EIO) { 381 // allow operation with older dm-verity drivers that are unaware 382 // of the mode parameter by omitting it; this also means that we 383 // cannot use logging mode with these drivers, they always cause 384 // an I/O error for corrupted blocks 385 strcpy(verity_params, table); 386 } else if (snprintf(verity_params, bufsize, "%s %d", table, mode) < 0) { 387 return -1; 388 } 389 390 // set next target boundary 391 verity_params += strlen(verity_params) + 1; 392 verity_params = (char*) (((unsigned long)verity_params + 7) & ~8); 393 tgt->next = verity_params - buffer; 394 395 // send the ioctl to load the verity table 396 if (ioctl(fd, DM_TABLE_LOAD, io)) { 397 ERROR("Error loading verity table (%s)", strerror(errno)); 398 return -1; 399 } 400 401 return 0; 402 } 403 404 static int resume_verity_table(struct dm_ioctl *io, char *name, int fd) 405 { 406 verity_ioctl_init(io, name, 0); 407 if (ioctl(fd, DM_DEV_SUSPEND, io)) { 408 ERROR("Error activating verity device (%s)", strerror(errno)); 409 return -1; 410 } 411 return 0; 412 } 413 414 static int test_access(char *device) { 415 int tries = 25; 416 while (tries--) { 417 if (!access(device, F_OK) || errno != ENOENT) { 418 return 0; 419 } 420 usleep(40 * 1000); 421 } 422 return -1; 423 } 424 425 static int check_verity_restart(const char *fname) 426 { 427 char buffer[VERITY_KMSG_BUFSIZE + 1]; 428 int fd; 429 int rc = 0; 430 ssize_t size; 431 struct stat s; 432 433 fd = TEMP_FAILURE_RETRY(open(fname, O_RDONLY | O_CLOEXEC)); 434 435 if (fd == -1) { 436 if (errno != ENOENT) { 437 ERROR("Failed to open %s (%s)\n", fname, strerror(errno)); 438 } 439 goto out; 440 } 441 442 if (fstat(fd, &s) == -1) { 443 ERROR("Failed to fstat %s (%s)\n", fname, strerror(errno)); 444 goto out; 445 } 446 447 size = VERITY_KMSG_BUFSIZE; 448 449 if (size > s.st_size) { 450 size = s.st_size; 451 } 452 453 if (lseek(fd, s.st_size - size, SEEK_SET) == -1) { 454 ERROR("Failed to lseek %jd %s (%s)\n", (intmax_t)(s.st_size - size), fname, 455 strerror(errno)); 456 goto out; 457 } 458 459 if (TEMP_FAILURE_RETRY(read(fd, buffer, size)) != size) { 460 ERROR("Failed to read %zd bytes from %s (%s)\n", size, fname, 461 strerror(errno)); 462 goto out; 463 } 464 465 buffer[size] = '\0'; 466 467 if (strstr(buffer, VERITY_KMSG_RESTART) != NULL) { 468 rc = 1; 469 } 470 471 out: 472 if (fd != -1) { 473 close(fd); 474 } 475 476 return rc; 477 } 478 479 static int was_verity_restart() 480 { 481 static const char *files[] = { 482 "/sys/fs/pstore/console-ramoops", 483 "/proc/last_kmsg", 484 NULL 485 }; 486 int i; 487 488 for (i = 0; files[i]; ++i) { 489 if (check_verity_restart(files[i])) { 490 return 1; 491 } 492 } 493 494 return 0; 495 } 496 497 static int metadata_add(FILE *fp, long start, const char *tag, 498 unsigned int length, off64_t *offset) 499 { 500 if (fseek(fp, start, SEEK_SET) < 0 || 501 fprintf(fp, "%s %u\n", tag, length) < 0) { 502 return -1; 503 } 504 505 *offset = ftell(fp); 506 507 if (fseek(fp, length, SEEK_CUR) < 0 || 508 fprintf(fp, METADATA_EOD " 0\n") < 0) { 509 return -1; 510 } 511 512 return 0; 513 } 514 515 static int metadata_find(const char *fname, const char *stag, 516 unsigned int slength, off64_t *offset) 517 { 518 FILE *fp = NULL; 519 char tag[METADATA_TAG_MAX_LENGTH + 1]; 520 int rc = -1; 521 int n; 522 long start = 0x4000; /* skip cryptfs metadata area */ 523 uint32_t magic; 524 unsigned int length = 0; 525 526 if (!fname) { 527 return -1; 528 } 529 530 fp = fopen(fname, "r+"); 531 532 if (!fp) { 533 ERROR("Failed to open %s (%s)\n", fname, strerror(errno)); 534 goto out; 535 } 536 537 /* check magic */ 538 if (fseek(fp, start, SEEK_SET) < 0 || 539 fread(&magic, sizeof(magic), 1, fp) != 1) { 540 ERROR("Failed to read magic from %s (%s)\n", fname, strerror(errno)); 541 goto out; 542 } 543 544 if (magic != METADATA_MAGIC) { 545 magic = METADATA_MAGIC; 546 547 if (fseek(fp, start, SEEK_SET) < 0 || 548 fwrite(&magic, sizeof(magic), 1, fp) != 1) { 549 ERROR("Failed to write magic to %s (%s)\n", fname, strerror(errno)); 550 goto out; 551 } 552 553 rc = metadata_add(fp, start + sizeof(magic), stag, slength, offset); 554 if (rc < 0) { 555 ERROR("Failed to add metadata to %s: %s\n", fname, strerror(errno)); 556 } 557 558 goto out; 559 } 560 561 start += sizeof(magic); 562 563 while (1) { 564 n = fscanf(fp, "%" STRINGIFY(METADATA_TAG_MAX_LENGTH) "s %u\n", 565 tag, &length); 566 567 if (n == 2 && strcmp(tag, METADATA_EOD)) { 568 /* found a tag */ 569 start = ftell(fp); 570 571 if (!strcmp(tag, stag) && length == slength) { 572 *offset = start; 573 rc = 0; 574 goto out; 575 } 576 577 start += length; 578 579 if (fseek(fp, length, SEEK_CUR) < 0) { 580 ERROR("Failed to seek %s (%s)\n", fname, strerror(errno)); 581 goto out; 582 } 583 } else { 584 rc = metadata_add(fp, start, stag, slength, offset); 585 if (rc < 0) { 586 ERROR("Failed to write metadata to %s: %s\n", fname, 587 strerror(errno)); 588 } 589 goto out; 590 } 591 } 592 593 out: 594 if (fp) { 595 fflush(fp); 596 fclose(fp); 597 } 598 599 return rc; 600 } 601 602 static int write_verity_state(const char *fname, off64_t offset, int32_t mode) 603 { 604 int fd; 605 int rc = -1; 606 struct verity_state s = { VERITY_STATE_HEADER, VERITY_STATE_VERSION, mode }; 607 608 fd = TEMP_FAILURE_RETRY(open(fname, O_WRONLY | O_SYNC | O_CLOEXEC)); 609 610 if (fd == -1) { 611 ERROR("Failed to open %s (%s)\n", fname, strerror(errno)); 612 goto out; 613 } 614 615 if (TEMP_FAILURE_RETRY(pwrite64(fd, &s, sizeof(s), offset)) != sizeof(s)) { 616 ERROR("Failed to write %zu bytes to %s to offset %" PRIu64 " (%s)\n", 617 sizeof(s), fname, offset, strerror(errno)); 618 goto out; 619 } 620 621 rc = 0; 622 623 out: 624 if (fd != -1) { 625 close(fd); 626 } 627 628 return rc; 629 } 630 631 static int read_verity_state(const char *fname, off64_t offset, int *mode) 632 { 633 int fd = -1; 634 int rc = -1; 635 struct verity_state s; 636 637 fd = TEMP_FAILURE_RETRY(open(fname, O_RDONLY | O_CLOEXEC)); 638 639 if (fd == -1) { 640 ERROR("Failed to open %s (%s)\n", fname, strerror(errno)); 641 goto out; 642 } 643 644 if (TEMP_FAILURE_RETRY(pread64(fd, &s, sizeof(s), offset)) != sizeof(s)) { 645 ERROR("Failed to read %zu bytes from %s offset %" PRIu64 " (%s)\n", 646 sizeof(s), fname, offset, strerror(errno)); 647 goto out; 648 } 649 650 if (s.header != VERITY_STATE_HEADER) { 651 /* space allocated, but no state written. write default state */ 652 *mode = VERITY_MODE_DEFAULT; 653 rc = write_verity_state(fname, offset, *mode); 654 goto out; 655 } 656 657 if (s.version != VERITY_STATE_VERSION) { 658 ERROR("Unsupported verity state version (%u)\n", s.version); 659 goto out; 660 } 661 662 if (s.mode < VERITY_MODE_EIO || 663 s.mode > VERITY_MODE_LAST) { 664 ERROR("Unsupported verity mode (%u)\n", s.mode); 665 goto out; 666 } 667 668 *mode = s.mode; 669 rc = 0; 670 671 out: 672 if (fd != -1) { 673 close(fd); 674 } 675 676 return rc; 677 } 678 679 static int compare_last_signature(struct fstab_rec *fstab, int *match) 680 { 681 char tag[METADATA_TAG_MAX_LENGTH + 1]; 682 char *signature = NULL; 683 int fd = -1; 684 int rc = -1; 685 uint8_t curr[SHA256_DIGEST_SIZE]; 686 uint8_t prev[SHA256_DIGEST_SIZE]; 687 off64_t offset = 0; 688 uint64_t device_size; 689 690 *match = 1; 691 692 // get verity filesystem size 693 if (get_fs_size(fstab->fs_type, fstab->blk_device, &device_size) < 0) { 694 ERROR("Failed to get filesystem size\n"); 695 goto out; 696 } 697 698 if (read_verity_metadata(device_size, fstab->blk_device, &signature, NULL) < 0) { 699 ERROR("Failed to read verity signature from %s\n", fstab->mount_point); 700 goto out; 701 } 702 703 SHA256_hash(signature, RSANUMBYTES, curr); 704 705 if (snprintf(tag, sizeof(tag), VERITY_LASTSIG_TAG "_%s", 706 basename(fstab->mount_point)) >= (int)sizeof(tag)) { 707 ERROR("Metadata tag name too long for %s\n", fstab->mount_point); 708 goto out; 709 } 710 711 if (metadata_find(fstab->verity_loc, tag, SHA256_DIGEST_SIZE, 712 &offset) < 0) { 713 goto out; 714 } 715 716 fd = TEMP_FAILURE_RETRY(open(fstab->verity_loc, O_RDWR | O_SYNC | O_CLOEXEC)); 717 718 if (fd == -1) { 719 ERROR("Failed to open %s: %s\n", fstab->verity_loc, strerror(errno)); 720 goto out; 721 } 722 723 if (TEMP_FAILURE_RETRY(pread64(fd, prev, sizeof(prev), 724 offset)) != sizeof(prev)) { 725 ERROR("Failed to read %zu bytes from %s offset %" PRIu64 " (%s)\n", 726 sizeof(prev), fstab->verity_loc, offset, strerror(errno)); 727 goto out; 728 } 729 730 *match = !memcmp(curr, prev, SHA256_DIGEST_SIZE); 731 732 if (!*match) { 733 /* update current signature hash */ 734 if (TEMP_FAILURE_RETRY(pwrite64(fd, curr, sizeof(curr), 735 offset)) != sizeof(curr)) { 736 ERROR("Failed to write %zu bytes to %s offset %" PRIu64 " (%s)\n", 737 sizeof(curr), fstab->verity_loc, offset, strerror(errno)); 738 goto out; 739 } 740 } 741 742 rc = 0; 743 744 out: 745 free(signature); 746 747 if (fd != -1) { 748 close(fd); 749 } 750 751 return rc; 752 } 753 754 static int get_verity_state_offset(struct fstab_rec *fstab, off64_t *offset) 755 { 756 char tag[METADATA_TAG_MAX_LENGTH + 1]; 757 758 if (snprintf(tag, sizeof(tag), VERITY_STATE_TAG "_%s", 759 basename(fstab->mount_point)) >= (int)sizeof(tag)) { 760 ERROR("Metadata tag name too long for %s\n", fstab->mount_point); 761 return -1; 762 } 763 764 return metadata_find(fstab->verity_loc, tag, sizeof(struct verity_state), 765 offset); 766 } 767 768 static int load_verity_state(struct fstab_rec *fstab, int *mode) 769 { 770 char propbuf[PROPERTY_VALUE_MAX]; 771 int match = 0; 772 off64_t offset = 0; 773 774 /* use the kernel parameter if set */ 775 property_get("ro.boot.veritymode", propbuf, ""); 776 777 if (*propbuf != '\0') { 778 if (!strcmp(propbuf, "enforcing")) { 779 *mode = VERITY_MODE_DEFAULT; 780 return 0; 781 } else if (!strcmp(propbuf, "logging")) { 782 *mode = VERITY_MODE_LOGGING; 783 return 0; 784 } else { 785 INFO("Unknown value %s for veritymode; ignoring", propbuf); 786 } 787 } 788 789 if (get_verity_state_offset(fstab, &offset) < 0) { 790 /* fall back to stateless behavior */ 791 *mode = VERITY_MODE_EIO; 792 return 0; 793 } 794 795 if (was_verity_restart()) { 796 /* device was restarted after dm-verity detected a corrupted 797 * block, so switch to logging mode */ 798 *mode = VERITY_MODE_LOGGING; 799 return write_verity_state(fstab->verity_loc, offset, *mode); 800 } 801 802 if (!compare_last_signature(fstab, &match) && !match) { 803 /* partition has been reflashed, reset dm-verity state */ 804 *mode = VERITY_MODE_DEFAULT; 805 return write_verity_state(fstab->verity_loc, offset, *mode); 806 } 807 808 return read_verity_state(fstab->verity_loc, offset, mode); 809 } 810 811 int fs_mgr_load_verity_state(int *mode) 812 { 813 char fstab_filename[PROPERTY_VALUE_MAX + sizeof(FSTAB_PREFIX)]; 814 char propbuf[PROPERTY_VALUE_MAX]; 815 int rc = -1; 816 int i; 817 int current; 818 struct fstab *fstab = NULL; 819 820 /* return the default mode, unless any of the verified partitions are in 821 * logging mode, in which case return that */ 822 *mode = VERITY_MODE_DEFAULT; 823 824 property_get("ro.hardware", propbuf, ""); 825 snprintf(fstab_filename, sizeof(fstab_filename), FSTAB_PREFIX"%s", propbuf); 826 827 fstab = fs_mgr_read_fstab(fstab_filename); 828 829 if (!fstab) { 830 ERROR("Failed to read %s\n", fstab_filename); 831 goto out; 832 } 833 834 for (i = 0; i < fstab->num_entries; i++) { 835 if (!fs_mgr_is_verified(&fstab->recs[i])) { 836 continue; 837 } 838 839 rc = load_verity_state(&fstab->recs[i], ¤t); 840 if (rc < 0) { 841 continue; 842 } 843 844 if (current == VERITY_MODE_LOGGING) { 845 *mode = current; 846 } 847 } 848 849 rc = 0; 850 851 out: 852 if (fstab) { 853 fs_mgr_free_fstab(fstab); 854 } 855 856 return rc; 857 } 858 859 int fs_mgr_update_verity_state(fs_mgr_verity_state_callback callback) 860 { 861 _Alignas(struct dm_ioctl) char buffer[DM_BUF_SIZE]; 862 char fstab_filename[PROPERTY_VALUE_MAX + sizeof(FSTAB_PREFIX)]; 863 char *mount_point; 864 char propbuf[PROPERTY_VALUE_MAX]; 865 char *status; 866 int fd = -1; 867 int i; 868 int mode; 869 int rc = -1; 870 off64_t offset = 0; 871 struct dm_ioctl *io = (struct dm_ioctl *) buffer; 872 struct fstab *fstab = NULL; 873 874 /* check if we need to store the state */ 875 property_get("ro.boot.veritymode", propbuf, ""); 876 877 if (*propbuf != '\0') { 878 return 0; /* state is kept by the bootloader */ 879 } 880 881 fd = TEMP_FAILURE_RETRY(open("/dev/device-mapper", O_RDWR | O_CLOEXEC)); 882 883 if (fd == -1) { 884 ERROR("Error opening device mapper (%s)\n", strerror(errno)); 885 goto out; 886 } 887 888 property_get("ro.hardware", propbuf, ""); 889 snprintf(fstab_filename, sizeof(fstab_filename), FSTAB_PREFIX"%s", propbuf); 890 891 fstab = fs_mgr_read_fstab(fstab_filename); 892 893 if (!fstab) { 894 ERROR("Failed to read %s\n", fstab_filename); 895 goto out; 896 } 897 898 for (i = 0; i < fstab->num_entries; i++) { 899 if (!fs_mgr_is_verified(&fstab->recs[i])) { 900 continue; 901 } 902 903 if (get_verity_state_offset(&fstab->recs[i], &offset) < 0 || 904 read_verity_state(fstab->recs[i].verity_loc, offset, &mode) < 0) { 905 continue; 906 } 907 908 mount_point = basename(fstab->recs[i].mount_point); 909 verity_ioctl_init(io, mount_point, 0); 910 911 if (ioctl(fd, DM_TABLE_STATUS, io)) { 912 ERROR("Failed to query DM_TABLE_STATUS for %s (%s)\n", mount_point, 913 strerror(errno)); 914 continue; 915 } 916 917 status = &buffer[io->data_start + sizeof(struct dm_target_spec)]; 918 919 if (*status == 'C') { 920 if (write_verity_state(fstab->recs[i].verity_loc, offset, 921 VERITY_MODE_LOGGING) < 0) { 922 continue; 923 } 924 } 925 926 if (callback) { 927 callback(&fstab->recs[i], mount_point, mode, *status); 928 } 929 } 930 931 rc = 0; 932 933 out: 934 if (fstab) { 935 fs_mgr_free_fstab(fstab); 936 } 937 938 if (fd) { 939 close(fd); 940 } 941 942 return rc; 943 } 944 945 int fs_mgr_setup_verity(struct fstab_rec *fstab) { 946 947 int retval = FS_MGR_SETUP_VERITY_FAIL; 948 int fd = -1; 949 int mode; 950 951 char *verity_blk_name = 0; 952 char *verity_table = 0; 953 char *verity_table_signature = 0; 954 uint64_t device_size = 0; 955 956 _Alignas(struct dm_ioctl) char buffer[DM_BUF_SIZE]; 957 struct dm_ioctl *io = (struct dm_ioctl *) buffer; 958 char *mount_point = basename(fstab->mount_point); 959 960 // set the dm_ioctl flags 961 io->flags |= 1; 962 io->target_count = 1; 963 964 // get verity filesystem size 965 if (get_fs_size(fstab->fs_type, fstab->blk_device, &device_size) < 0) { 966 return retval; 967 } 968 969 // read the verity block at the end of the block device 970 // send error code up the chain so we can detect attempts to disable verity 971 retval = read_verity_metadata(device_size, 972 fstab->blk_device, 973 &verity_table_signature, 974 &verity_table); 975 if (retval < 0) { 976 goto out; 977 } 978 979 retval = FS_MGR_SETUP_VERITY_FAIL; 980 981 // get the device mapper fd 982 if ((fd = open("/dev/device-mapper", O_RDWR)) < 0) { 983 ERROR("Error opening device mapper (%s)", strerror(errno)); 984 goto out; 985 } 986 987 // create the device 988 if (create_verity_device(io, mount_point, fd) < 0) { 989 ERROR("Couldn't create verity device!"); 990 goto out; 991 } 992 993 // get the name of the device file 994 if (get_verity_device_name(io, mount_point, fd, &verity_blk_name) < 0) { 995 ERROR("Couldn't get verity device number!"); 996 goto out; 997 } 998 999 // verify the signature on the table 1000 if (verify_table(verity_table_signature, 1001 verity_table, 1002 strlen(verity_table)) < 0) { 1003 goto out; 1004 } 1005 1006 if (load_verity_state(fstab, &mode) < 0) { 1007 /* if accessing or updating the state failed, switch to the default 1008 * safe mode. This makes sure the device won't end up in an endless 1009 * restart loop, and no corrupted data will be exposed to userspace 1010 * without a warning. */ 1011 mode = VERITY_MODE_EIO; 1012 } 1013 1014 INFO("Enabling dm-verity for %s (mode %d)\n", mount_point, mode); 1015 1016 // load the verity mapping table 1017 if (load_verity_table(io, mount_point, device_size, fd, verity_table, 1018 mode) < 0) { 1019 goto out; 1020 } 1021 1022 // activate the device 1023 if (resume_verity_table(io, mount_point, fd) < 0) { 1024 goto out; 1025 } 1026 1027 // mark the underlying block device as read-only 1028 fs_mgr_set_blk_ro(fstab->blk_device); 1029 1030 // assign the new verity block device as the block device 1031 free(fstab->blk_device); 1032 fstab->blk_device = verity_blk_name; 1033 verity_blk_name = 0; 1034 1035 // make sure we've set everything up properly 1036 if (test_access(fstab->blk_device) < 0) { 1037 goto out; 1038 } 1039 1040 retval = FS_MGR_SETUP_VERITY_SUCCESS; 1041 1042 out: 1043 if (fd != -1) { 1044 close(fd); 1045 } 1046 1047 free(verity_table); 1048 free(verity_table_signature); 1049 free(verity_blk_name); 1050 1051 return retval; 1052 } 1053