diff options
Diffstat (limited to 'ndiff/scripts')
-rwxr-xr-x | ndiff/scripts/ndiff | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/ndiff/scripts/ndiff b/ndiff/scripts/ndiff new file mode 100755 index 0000000..b80e99b --- /dev/null +++ b/ndiff/scripts/ndiff @@ -0,0 +1,84 @@ +#!/usr/bin/env python3 + +# Ndiff +# +# This programs reads two Nmap XML files and displays a list of their +# differences. +# +# Copyright 2021 Nmap Software LLC +# Ndiff is distributed under the same license as Nmap. See the file +# LICENSE in the Nmap source distribution or +# https://nmap.org/book/man-legal.html for more details. +# +# Original author was David Fifield based on a design by Michael Pattrick + +import sys + +# Check if the given directory, and all its parent directories, are owned and +# writable only by our euid or by root. If symlinks are present, they are +# recursively checked, up to a limit of SYMLINK_LIMIT. +# https://www.securecoding.cert.org/confluence/display/seccode/FIO15-C.+Ensure+that+file+operations+are+performed+in+a+secure+directory +# We use this code for Zenmap too +SYMLINK_LIMIT = 5 +def is_secure_dir(path, num_symlinks=0): + import os + import os.path + import stat + + if not os.path.isabs(path): + return False + + if num_symlinks >= SYMLINK_LIMIT: + return False + + dirs = [] + while True: + dirs.append(path) + dirname = os.path.dirname(path) + if dirname == path: + break + path = dirname + # Traverse root-to-leaf. + dirs.reverse() + + for dir in dirs: + if os.path.islink(dir): + link = os.readlink(dir) + if not is_secure_dir(link, num_symlinks + 1): + return False + continue + if not os.path.isdir(dir): + return False + buf = os.stat(dir) + if buf.st_uid != os.geteuid() and buf.st_uid != 0: + return False + if buf.st_mode & (stat.S_IWGRP | stat.S_IWOTH) != 0: + return False + + return True + +# Add the install_lib directory to sys.path, the list of directories searched +# for modules, but don't do it if the directory or its parents may be writable +# by other users. The following line is replaced by the installation program. +INSTALL_LIB = None +if INSTALL_LIB is not None and is_secure_dir(INSTALL_LIB): + sys.path.append(INSTALL_LIB) # lgtm[py/unreachable-statement] + +try: + import ndiff +except ImportError as e: + print("""\ +Could not import the ndiff module: %s. +I checked in these directories:""" % repr(e), file=sys.stderr) + for dir in sys.path: + print(" %s" % dir, file=sys.stderr) + print("""\ +If you installed Ndiff in another directory, you may have to add the +modules directory to the PYTHONPATH environment variable.""", file=sys.stderr) + sys.exit(1) + +import ndiff + +if __name__ == "__main__": + sys.excepthook = ndiff.excepthook + sys.exit(ndiff.main()) |