diff --git a/secrules/rules01.py b/secrules/rules01.py new file mode 100644 index 0000000000000000000000000000000000000000..b98ab0debca9ebb15f52e43fda777f149a6fd962_c2VjcnVsZXMvcnVsZXMwMS5weQ== --- /dev/null +++ b/secrules/rules01.py @@ -0,0 +1,343 @@ +# -*- coding: iso-8859-1 -*- +__version__ = '1.0' +#__all__ = ['rule1201', 'rule1202', 'rule1203'] + +from common import level_rule +from vms.rtl import lib +from vms import syidef, uaidef, prvdef, dvidef, ossdef +from vms import user +from vms import starlet +from vms import itemList +from vms import crtl + +@level_rule(1) +def rule0101(fo, ftm): + """The following system-level accounts do not have account restrictions defined. + +Improper configuration of access restrictions could result in the compromise of +the operating system environment, and compromise the confidentiality of customer data""" + + maxsysgroup = lib.getsyi(syidef.SYI__MAXSYSGROUP)[1] + all_users = user.all_users() + + if not ftm: + print >>fo, 'Rule 0101' + print >>fo, '=========' + for u in all_users.values(): + if (u.uic_group <= maxsysgroup) and (u.dialup_access_p != '\xff\xff\xff'): + if ftm: + print >>fo, '0101�1� %-12s [%o,%o]' % (u.username, u.uic_group, u.uic_member) + else: + print >>fo, '%-12s [%o,%o]' % (u.username, u.uic_group, u.uic_member) + +@level_rule(2) +def rule0102(fo, ftm): + """The accounts listed have duplicate UICs. This is a security problem. +Accounts that share a common UIC allow the user of one account +to modify or delete the files of another account""" + + all_users = user.all_users() + + if not ftm: + print >>fo + print >>fo, 'Rule 0102' + print >>fo, '=========' + uics = {} + for u in all_users.values(): + uic = '[%o,%o]' % (u.uic_group, u.uic_member) + if uic in uics: + uics[uic].append(u.username) + else: + uics[uic] = [u.username,] + + for uic in uics: + if len(uics[uic]) > 1: + if ftm: + print >>fo, '0102�2�', uic, uics[uic] + else: + print >>fo, uic, uics[uic] + +@level_rule(3) +def rule0103(fo, ftm): + """Most accounts with these types of privileges are not part of the normal +operating system distribution and can represent a security risk.""" + + maxsysgroup = lib.getsyi(syidef.SYI__MAXSYSGROUP)[1] + all_users = user.all_users() + + if not ftm: + print >>fo + print >>fo, 'Rule 0103' + print >>fo, '=========' + for u in all_users.values(): + if (u.uic_group <= maxsysgroup): + if (u.priv | u.def_priv) & (prvdef.PRV_M_GROUP | prvdef.PRV_M_GRPPRV): + if ftm: + print >>fo, '0103�3�', u.username + else: + print >>fo, u.username + +@level_rule(3) +def rule0104(fo, ftm): + """A system level UIC is one in which the group number is less than, +or equal to, the SYSGEN parameter, MAXSYSGROUP. The group number is +defined at system generation time and may vary from site to site. +Account privileges allow users to add, modify or delete system files. +These accounts are not part of the normal operating +system distribution and can represent a security risk.""" + + maxsysgroup = lib.getsyi(syidef.SYI__MAXSYSGROUP)[1] + all_users = user.all_users() + + if not ftm: + print >>fo + print >>fo, 'Rule 0104' + print >>fo, '=========' + for u in all_users.values(): + if (u.uic_group <= maxsysgroup) and (u.username != 'SYSTEM'): + if ftm: + print >>fo, '0104�3�', u.username + else: + print >>fo, u.username + +@level_rule(3) +def rule0105(fo, ftm): + """Improperly granted privilege classes can grant unintended +privileges and accesses to users. This could result in the +compromise of the operating system environment, and compromise +the confidentiality of customer data.""" + + maxsysgroup = lib.getsyi(syidef.SYI__MAXSYSGROUP)[1] + all_users = user.all_users() + + if ftm: + print >>fo + print >>fo, 'Rule 0105' + print >>fo, '=========' + + privs = (prvdef.PRV_M_CMKRNL | + prvdef.PRV_M_CMEXEC | + prvdef.PRV_M_SYSNAM | + prvdef.PRV_M_GRPNAM | + prvdef.PRV_M_ALLSPOOL | + prvdef.PRV_M_IMPERSONATE | + prvdef.PRV_M_DIAGNOSE | + prvdef.PRV_M_LOG_IO | + prvdef.PRV_M_GROUP | + prvdef.PRV_M_NOACNT | + prvdef.PRV_M_PRMCEB | + prvdef.PRV_M_PRMMBX | + prvdef.PRV_M_PSWAPM | + prvdef.PRV_M_SETPRI | + prvdef.PRV_M_SETPRV | + prvdef.PRV_M_WORLD | + prvdef.PRV_M_MOUNT | + prvdef.PRV_M_OPER | + prvdef.PRV_M_EXQUOTA | + prvdef.PRV_M_VOLPRO | + prvdef.PRV_M_PHY_IO | + prvdef.PRV_M_BUGCHK | + prvdef.PRV_M_PRMGBL | + prvdef.PRV_M_SYSGBL | + prvdef.PRV_M_PFNMAP | + prvdef.PRV_M_SHMEM | + prvdef.PRV_M_SYSPRV | + prvdef.PRV_M_BYPASS | + prvdef.PRV_M_SYSLCK | + prvdef.PRV_M_SHARE | + prvdef.PRV_M_UPGRADE | + prvdef.PRV_M_DOWNGRADE | + prvdef.PRV_M_GRPPRV | + prvdef.PRV_M_READALL | + prvdef.PRV_M_IMPORT | + prvdef.PRV_M_AUDIT | + prvdef.PRV_M_SECURITY) + + for u in all_users.values(): + if (u.uic_group > maxsysgroup): + if (u.priv | u.def_priv) & privs: + if ftm: + print >>fo, '0105�3�', u.username + else: + print >>fo, u.username + +@level_rule(3) +def rule0106(fo, ftm): + """These accounts may no longer be valid or useful, and may +represent a security exposure to the system.""" + + all_users = user.all_users() + + if not ftm: + print >>fo + print >>fo, 'Rule 0106' + print >>fo, '=========' + for u in all_users.values(): + try: + lib.getdvi(dvidef.DVI__DEVNAM, None, u.defdev) + except: + if ftm: + print >>fo, '0106�3�', u.username + else: + print >>fo, u.username, u.defdev + +@level_rule(3) +def rule0107(fo, ftm): + """The device may not be online, mounted or available. +Security checks cannot be completed.""" + + all_users = user.all_users() + + if ftm: + print >>fo + print >>fo, 'Rule 0107' + print >>fo, '=========' + for u in all_users.values(): + try: + lib.getdvi(dvidef.DVI__AVL, None, u.defdev) + except: + if ftm: + print >>fo, '0107�3�', u.username + else: + print >>fo, u.username, u.defdev + +@level_rule(2) +def rule0108(fo, ftm): + """Improper home directory configuration can interfere with +the proper functioning of accounts. The accounts listed do not +have home directories. This is not consistent with the system +configuration. These accounts may be inactive or DISUSERed.""" + + all_users = user.all_users() + + if not ftm: + print >>fo + print >>fo, 'Rule 0108' + print >>fo, '=========' + for u in all_users.values(): + if (u.defdir == '') and (u.defdev == ''): + if ftm: + print >>fo, '0108�2�', u.username + else: + print >>fo, u.username + +@level_rule(3) +def rule0109(fo, ftm): + """Improper account ownership can prevent proper identification +of assigned privileges, result in auditing difficulties, and can +jeopardize overall system security.""" + + all_users = user.all_users() + + if not ftm: + print >>fo + print >>fo, 'Rule 0109' + print >>fo, '=========' + + privs = prvdef.PRV_M_TMPMBX | prvdef.PRV_M_NETMBX + u = all_users['DEFAULT'] + if (u.def_priv != u.priv) or (u.priv & ~privs) or (u.flags & uaidef.UAI_M_DISACNT) == 0: + if ftm: + print >>fo, '0109�3�', u.username + else: + print >>fo, u.username + + privs = (prvdef.PRV_M_TMPMBX | + prvdef.PRV_M_NETMBX | + prvdef.PRV_M_ALLSPOOL | + prvdef.PRV_M_DIAGNOSE | + prvdef.PRV_M_PHY_IO | + prvdef.PRV_M_GROUP | + prvdef.PRV_M_PRMCEB | + prvdef.PRV_M_GRPNAM | + prvdef.PRV_M_PRMMBX | + prvdef.PRV_M_LOG_IO | + prvdef.PRV_M_SETPRV) + if 'FIELD' in all_users: + u = all_users['FIELD'] + if (u.def_priv != u.priv) or (u.priv & ~privs) or (u.flags & uaidef.UAI_M_DISACNT) == 0: + if ftm: + print >>fo, '0109�3�', u.username + else: + print >>fo, u.username + + privs = (prvdef.PRV_M_CMEXEC | + prvdef.PRV_M_IMPERSONATE | + prvdef.PRV_M_PRMMBX | + prvdef.PRV_M_VOLPRO | + prvdef.PRV_M_CMKRNL | + prvdef.PRV_M_LOG_IO | + prvdef.PRV_M_SETPRV | + prvdef.PRV_M_DIAGNOSE | + prvdef.PRV_M_NETMBX | + prvdef.PRV_M_SYSNAM | + prvdef.PRV_M_GROUP | + prvdef.PRV_M_PHY_IO | + prvdef.PRV_M_SYSPRV | + prvdef.PRV_M_GRPNAM | + prvdef.PRV_M_PRMCEB | + prvdef.PRV_M_TMPMBX) + + if 'SYSTEST' in all_users: + u = all_users['SYSTEST'] + if (u.def_priv != u.priv) or (u.priv & ~privs) or (u.flags & uaidef.UAI_M_DISACNT) == 0: + if ftm: + print >>fo, '0109�3�', u.username + else: + print >>fo, u.username + + if 'SYSTEST_CLIG' in all_users: + u = all_users['SYSTEST_CLIG'] + if (u.def_priv != u.priv) or (u.priv & ~privs) or (u.flags & uaidef.UAI_M_DISACNT) == 0: + if ftm: + print >>fo, '0109�3�', u.username + else: + print >>fo, u.username + +@level_rule(3) +def rule0110(fo, ftm): + """ Improper configuration of account related SYSGEN parameters +could result in the compromise of the operating system environment, +and compromise the confidentiality of customer data.""" + + maxsysgroup = lib.getsyi(syidef.SYI__MAXSYSGROUP)[1] + + if not ftm: + print >>fo + print >>fo, 'Rule 0110' + print >>fo, '=========' + + load_pwd_policy = lib.getsyi(syidef.SYI__LOAD_PWD_POLICY)[1] + rms_fileprot = lib.getsyi(syidef.SYI__RMS_FILEPROT)[1] + + if (load_pwd_policy != 0): + if ftm: + print >>fo, '0110�3�LOAD_PWD_POLICY', load_pwd_policy + else: + print >>fo, 'LOAD_PWD_POLICY invalid', load_pwd_policy + if (maxsysgroup > 8): + if ftm: + print >>fo, '0110�3�MAXSYSGROUP', maxsysgroup + else: + print >>fo, 'MAXSYSGROUP invalid' , maxsysgroup + if (rms_fileprot != 65280): + if ftm: + print >>fo, '0110�3�RMS_FILEPROT', lib.format_sogw_prot (rms_fileprot)[1] + else: + print >>fo, 'RMS_FILEPROT invalid found', lib.format_sogw_prot (rms_fileprot)[1] + print >>fo, ' waiting', lib.format_sogw_prot (65280)[1] + + +if __name__ == '__main__': + import sys + fo = open(sys.argv[1], 'w') if len(sys.argv) > 1 else sys.stdout + rule0101(fo, len(sys.argv) > 2) + rule0102(fo, len(sys.argv) > 2) + rule0103(fo, len(sys.argv) > 2) + rule0104(fo, len(sys.argv) > 2) + rule0105(fo, len(sys.argv) > 2) + rule0106(fo, len(sys.argv) > 2) + rule0107(fo, len(sys.argv) > 2) + rule0108(fo, len(sys.argv) > 2) + rule0109(fo, len(sys.argv) > 2) + rule0110(fo, len(sys.argv) > 2)