Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/kern Small changes:
details: https://anonhg.NetBSD.org/src/rev/253e49e75961
branches: trunk
changeset: 809844:253e49e75961
user: maxv <maxv%NetBSD.org@localhost>
date: Tue Aug 04 11:42:08 2015 +0000
description:
Small changes:
- remove the per-page stuff. It has been disabled for 10 years, and it is
not implemented properly.
- typo in comment
- use KASSERT
diffstat:
sys/kern/kern_veriexec.c | 161 ++--------------------------------------------
1 files changed, 10 insertions(+), 151 deletions(-)
diffs (271 lines):
diff -r 945cbef0c603 -r 253e49e75961 sys/kern/kern_veriexec.c
--- a/sys/kern/kern_veriexec.c Tue Aug 04 08:36:14 2015 +0000
+++ b/sys/kern/kern_veriexec.c Tue Aug 04 11:42:08 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_veriexec.c,v 1.9 2015/07/24 13:02:52 maxv Exp $ */
+/* $NetBSD: kern_veriexec.c,v 1.10 2015/08/04 11:42:08 maxv Exp $ */
/*-
* Copyright (c) 2005, 2006 Elad Efrat <elad%NetBSD.org@localhost>
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_veriexec.c,v 1.9 2015/07/24 13:02:52 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_veriexec.c,v 1.10 2015/08/04 11:42:08 maxv Exp $");
#include "opt_veriexec.h"
@@ -92,11 +92,7 @@
u_char *filename; /* File name. */
u_char type; /* Entry type. */
u_char status; /* Evaluation status. */
- u_char page_fp_status; /* Per-page FP status. */
u_char *fp; /* Fingerprint. */
- void *page_fp; /* Per-page fingerprints */
- size_t npages; /* Number of pages. */
- size_t last_page_size; /* To support < PAGE_SIZE */
struct veriexec_fpops *ops; /* Fingerprint ops vector*/
size_t filename_len; /* Length of filename. */
};
@@ -227,7 +223,7 @@
}
/*
- * Add ops to the fignerprint ops vector list.
+ * Add ops to the fingerprint ops vector list.
*/
int
veriexec_fpops_add(const char *fp_type, size_t hash_len, size_t ctx_size,
@@ -236,16 +232,14 @@
{
struct veriexec_fpops *ops;
- /* Sanity check all parameters. */
- if ((fp_type == NULL) || (hash_len == 0) || (ctx_size == 0) ||
- (init == NULL) || (update == NULL) || (final == NULL))
- return (EFAULT);
+ KASSERT((init != NULL) && (update != NULL) && (final != NULL));
+ KASSERT((hash_len != 0) && (ctx_size != 0));
+ KASSERT(fp_type != NULL);
if (veriexec_fpops_lookup(fp_type) != NULL)
return (EEXIST);
ops = kmem_alloc(sizeof(*ops), KM_SLEEP);
-
ops->type = fp_type;
ops->hash_len = hash_len;
ops->context_size = ctx_size;
@@ -422,11 +416,11 @@
struct veriexec_file_entry *vfe, u_char *fp)
{
struct vattr va;
- void *ctx, *page_ctx;
- u_char *buf, *page_fp;
+ void *ctx;
+ u_char *buf;
off_t offset, len;
- size_t resid, npages;
- int error, do_perpage, pagen;
+ size_t resid;
+ int error;
KASSERT(file_lock_state != VERIEXEC_LOCKED);
KASSERT(file_lock_state != VERIEXEC_UNLOCKED);
@@ -439,32 +433,13 @@
if (error)
return (error);
-#ifdef notyet /* XXX - for now */
- if ((vfe->type & VERIEXEC_UNTRUSTED) &&
- (vfe->page_fp_status == PAGE_FP_NONE))
- do_perpage = 1;
- else
-#endif /* notyet */
- do_perpage = 0;
-
ctx = kmem_alloc(vfe->ops->context_size, KM_SLEEP);
buf = kmem_alloc(PAGE_SIZE, KM_SLEEP);
- page_ctx = NULL;
- page_fp = NULL;
- npages = 0;
- if (do_perpage) {
- npages = (va.va_size >> PAGE_SHIFT) + 1;
- page_fp = kmem_alloc(vfe->ops->hash_len * npages, KM_SLEEP);
- vfe->page_fp = page_fp;
- page_ctx = kmem_alloc(vfe->ops->context_size, KM_SLEEP);
- }
-
(vfe->ops->init)(ctx);
len = 0;
error = 0;
- pagen = 0;
for (offset = 0; offset < va.va_size; offset += PAGE_SIZE) {
len = ((va.va_size - offset) < PAGE_SIZE) ?
(va.va_size - offset) : PAGE_SIZE;
@@ -476,51 +451,18 @@
l->l_cred, &resid, NULL);
if (error) {
- if (do_perpage) {
- kmem_free(vfe->page_fp,
- vfe->ops->hash_len * npages);
- vfe->page_fp = NULL;
- }
-
goto bad;
}
(vfe->ops->update)(ctx, buf, (unsigned int) len);
- if (do_perpage) {
- (vfe->ops->init)(page_ctx);
- (vfe->ops->update)(page_ctx, buf, (unsigned int)len);
- (vfe->ops->final)(page_fp, page_ctx);
-
- if (veriexec_verbose >= 2) {
- int i;
-
- printf("hash for page %d: ", pagen);
- for (i = 0; i < vfe->ops->hash_len; i++)
- printf("%02x", page_fp[i]);
- printf("\n");
- }
-
- page_fp += vfe->ops->hash_len;
- pagen++;
- }
-
if (len != PAGE_SIZE)
break;
}
(vfe->ops->final)(fp, ctx);
- if (do_perpage) {
- vfe->last_page_size = len;
- vfe->page_fp_status = PAGE_FP_READY;
- vfe->npages = npages;
- }
-
bad:
- if (do_perpage)
- kmem_free(page_ctx, vfe->ops->context_size);
-
kmem_free(ctx, vfe->ops->context_size);
kmem_free(buf, PAGE_SIZE);
@@ -606,7 +548,6 @@
{
if (vfe != NULL && vfe->filename != NULL)
filename = vfe->filename;
-
if (filename == NULL)
return;
@@ -782,81 +723,6 @@
return (r);
}
-#ifdef notyet
-/*
- * Evaluate per-page fingerprints.
- */
-int
-veriexec_page_verify(struct veriexec_file_entry *vfe, struct vm_page *pg,
- size_t idx, struct lwp *l)
-{
- void *ctx;
- u_char *fp;
- u_char *page_fp;
- int error;
- vaddr_t kva;
-
- if (vfe->page_fp_status == PAGE_FP_NONE)
- return (0);
-
- if (vfe->page_fp_status == PAGE_FP_FAIL)
- return (EPERM);
-
- if (idx >= vfe->npages)
- return (0);
-
- ctx = kmem_alloc(vfe->ops->context_size, KM_SLEEP);
- fp = kmem_alloc(vfe->ops->hash_len, KM_SLEEP);
- kva = uvm_km_alloc(kernel_map, PAGE_SIZE, VM_PGCOLOR_BUCKET(pg),
- UVM_KMF_COLORMATCH | UVM_KMF_VAONLY | UVM_KMF_WAITVA);
- pmap_kenter_pa(kva, VM_PAGE_TO_PHYS(pg), VM_PROT_READ, 0);
- pmap_update(pmap_kernel());
-
- page_fp = (u_char *) vfe->page_fp + (vfe->ops->hash_len * idx);
- (vfe->ops->init)(ctx);
- (vfe->ops->update)(ctx, (void *) kva,
- ((vfe->npages - 1) == idx) ? vfe->last_page_size
- : PAGE_SIZE);
- (vfe->ops->final)(fp, ctx);
-
- pmap_kremove(kva, PAGE_SIZE);
- pmap_update(pmap_kernel());
- uvm_km_free(kernel_map, kva, PAGE_SIZE, UVM_KMF_VAONLY);
-
- error = veriexec_fp_cmp(vfe->ops, page_fp, fp);
- if (error) {
- const char *msg;
-
- if (veriexec_strict > VERIEXEC_LEARNING) {
- msg = "Pages modified: Killing process.";
- } else {
- msg = "Pages modified.";
- error = 0;
- }
-
- veriexec_file_report(msg, "[page_in]", l,
- REPORT_ALWAYS|REPORT_ALARM);
-
- if (error) {
- ksiginfo_t ksi;
-
- KSI_INIT(&ksi);
- ksi.ksi_signo = SIGKILL;
- ksi.ksi_code = SI_NOINFO;
- ksi.ksi_pid = l->l_proc->p_pid;
- ksi.ksi_uid = 0;
-
- kpsignal(l->l_proc, &ksi, NULL);
- }
- }
-
- kmem_free(ctx, vfe->ops->context_size);
- kmem_free(fp, vfe->ops->hash_len);
-
- return (error);
-}
-#endif /* notyet */
-
/*
* Veriexec remove policy code.
*/
@@ -992,8 +858,6 @@
if (vfe != NULL) {
if (vfe->fp != NULL)
kmem_free(vfe->fp, vfe->ops->hash_len);
- if (vfe->page_fp != NULL)
- kmem_free(vfe->page_fp, vfe->ops->hash_len);
if (vfe->filename != NULL)
kmem_free(vfe->filename, vfe->filename_len);
rw_destroy(&vfe->lock);
@@ -1267,11 +1131,6 @@
} else
vfe->filename = NULL;
- vfe->page_fp = NULL;
- vfe->page_fp_status = PAGE_FP_NONE;
- vfe->npages = 0;
- vfe->last_page_size = 0;
-
if (prop_bool_true(prop_dictionary_get(dict, "eval-on-load")) ||
(vfe->type & VERIEXEC_UNTRUSTED)) {
u_char status;
Home |
Main Index |
Thread Index |
Old Index