509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
í«„^Ú^  ã               @   sp  d dl Z d dlmZmZ d dlmZ d dlmZ ddlm	Z	m
Z
mZ ddlmZmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZmZ ddlmZ edƒZedƒZedddddgƒZeddddgƒZG dd„ deƒZedddgƒZ edddgƒZ!ed ddgƒZ"d!d"„ Z#d#d$„ Z$d%d&„ Z%d'd(„ Z&d)d*„ Z'd+d,„ Z(d-d.„ Z)G d/d0„ d0eƒZ*G d1d2„ d2eƒZ+G d3d4„ d4eƒZ,dS )5é    N)ÚdefaultdictÚ
namedtuple)Úintern)ÚEnumé   )ÚRuleNotConditionalÚRuleUseErrorÚTERuleNoFilename)ÚIoctlSetÚ
TERuletypeé   )Úconditional_wrapper_factory)ÚDiffResultDescriptor)Ú
DifferenceÚWrapper)Útype_wrapper_factoryÚtype_or_attr_wrapper_factory)Úclass_wrapper_factoryz<<unconditional>>ÚTrueZmodified_avruleÚruleÚadded_permsÚremoved_permsÚmatched_permsZmodified_teruleZadded_defaultZremoved_defaultc               @   s   e Zd ZdZdZdS )ÚSider   r   N)Ú__name__Ú
__module__Ú__qualname__ÚleftÚright© r   r   ú/usr/lib64/python3.6/terules.pyr   -   s   r   Zrule_db_side_dataÚpermsÚ	orig_ruleZrule_db_sidesr   r   ZType_dbc             C   s  |t jkr|j}n|j}�xè| D �]Þ}t}t}y tt|jƒƒ}tt|jƒƒ}W n t	k
rb   Y nX ||kr†t
ƒ ||< t
ƒ || |< n||| kr t
ƒ || |< |jj}dd„ |jD ƒ}	t|	|ƒ}
|| | }�x.|jjƒ D �]}|j}||krø|||< ||k�rt
ƒ ||< xî|jjƒ D ]à}|j}||k�r4|||< ||| k�rPt
ƒ || |< d}d}||| | k�r†|| | | }|j}|j}|t jk�rº|�sž|
}n|j|	B }|j}t||ƒ}n&|�sÆ|
}n|j|	B }|j}t||ƒ}t||ƒ|| | |< �qW qÜW q W dS )aP  
    Using rule_list, build up rule_db which is a data structure which consists
    of nested dicts that store BOTH the left and the right policies. All of the
    keys are interned strings. The permissions are stored as a set. The basic
    structure is rule_db[cond_exp][block_bool][src][tgt][tclass] = sides
    where:
      cond_exp is a boolean expression
      block_bool is either true or false
      src is the source type
      tgt is the target type
      tclass is the target class
      sides is a named tuple with attributes "left" and "right" referring to the
        left or right policy. Each attribute in the sides named tuple refers to a
        named tuple with attributes "perms" and "orig_rule" which refer to a
        permission set and the original unexpanded rule.
        sides = ((left_perms, left_orig_rule),(right_perms, right_orig_rule))
    There are a few advantages to this structure. First, it takes up way less
    memory. Second, it allows redundant rules to be easily eliminated. And,
    third, it makes it easy to create the added, removed, and modified rules.
    c             S   s   h | ]}|’qS r   r   )Ú.0Úpr   r   r    ú	<setcomp>c   s    z+_avrule_expand_generator.<locals>.<setcomp>N)r   r   r   ÚTERULES_UNCONDITIONALÚTERULES_UNCONDITIONAL_BLOCKr   ÚstrÚconditionalÚconditional_blockr   ÚdictÚtclassÚnamer!   Úrule_db_side_data_recordÚsourceÚexpandÚtargetr"   Úrule_db_sides_record)Ú	rule_listÚrule_dbÚtype_dbZsideÚtypesÚunexpanded_ruleÚcond_expÚ
block_boolr,   r!   Ú	side_dataÚblockÚsrcZsrc_strÚtgtZtgt_strÚ	left_sideÚ
right_sideZsidesr$   Zorigr   r   r    Ú_avrule_expand_generator9   sd    








r@   c             C   sx  | t  t }�xd| jƒ D �]V\}}|t kr,q�x@|jƒ D �]2\}}�x&|jƒ D �]\}}||krbqN�x|jƒ D ]ö\}}	||| kr„qnxÞ|	jƒ D ]Ò\}
}|
|| | kr¨qŽ|| | |
 }|j}|j}|joÌ|�r|j|jj@ }|�r|j| }|�rt||jƒ}nd }t||ƒ|	|
< |jrŽ|rŽ|j|jj@ }|rŽ|j| }|�rNt||jƒ}nd }t||ƒ|	|
< qŽW qnW qNW q8W qW d S )N)	r&   r'   Úitemsr   r   r!   r.   r"   r2   )r4   Zuncond_blockr8   Úcond_blocksr9   r;   r<   Úsrc_datar=   Útgt_datar,   r:   Zuncond_side_datar>   r?   Úcr$   r   r   r    Ú_av_remove_redundant_rules“   sB    


rF   c             C   s|  g }g }g }�xb|j ƒ D �]T\}}�xH|j ƒ D �]:\}}	�x.|	j ƒ D �] \}
}�x|j ƒ D �]\}}xü|j ƒ D ]ð\}}|jrî|jrî|jj|jj@ }|jj| }|jj| }|s²|rì|jj}|j|j|
 |j| |jjƒ}|jt||||ƒƒ qn|j�r(|jj}|j|j|
 |j| |jjƒ}|j|ƒ qn|jrn|jj}|j|j|
 |j| |jjƒ}|j|ƒ qnW qZW qDW q.W qW |||fS )N)rA   r   r   r!   r"   Zderive_expandedÚappendÚmodified_avrule_record)Úruletyper4   r5   ÚaddedÚremovedÚmodifiedr8   rB   r9   r;   r<   rC   r=   rD   r,   r:   Zcommon_permsZ
left_permsZright_permsZoriginal_ruler   r   r   r    Ú_av_generate_diffs¹   sB    




rM   c                s   t jˆ ƒ‰ ‡ fdd„}|S )z€
    This is a template for the access vector diff functions.

    Parameters:
    ruletype    The rule type, e.g. "allow".
    c                s  | j jdjˆ | ƒƒ | j s$| j r,| jƒ  ttƒ tƒ ƒ}tƒ }tƒ |t< tƒ |t t	< t
jdƒ t| jˆ  ||tjƒ t
jdƒ t| jˆ  ||tjƒ t
jdƒ t|ƒ t
jdƒ tˆ ||ƒ\}}}|jjƒ  |jjƒ  |jƒ  t| djˆ ƒ|ƒ t| djˆ ƒ|ƒ t| djˆ ƒ|ƒ d	S )
z6Generate the difference in rules between the policies.zCGenerating {0} differences from {1.left_policy} to {1.right_policy}zExpanding left policyzExpanding right policyzRemoving redundant rulesz0Generating added, removed, and modified av rulesz
added_{0}szremoved_{0}szmodified_{0}sN)ÚlogÚinfoÚformatÚ_left_te_rulesÚ_right_te_rulesÚ_create_te_rule_listsÚtype_db_recordr+   r&   r'   Úloggingr@   r   r   r   rF   rM   ÚclearÚsetattr)Úselfr5   r4   rJ   rK   rL   )rI   r   r    Údiffç   s.    







zav_diff_template.<locals>.diff)r   Úlookup)rI   rY   r   )rI   r    Úav_diff_templateÝ   s    
#r[   c             C   sŒ   t ƒ }x\| D ]T}xN|jƒ D ]B}||ƒ}y||  j|jO  _W q tk
rZ   |||< Y qX qW qW |r„tjtƒjdj|t	|ƒƒƒ |j
ƒ S )z`
    Generator that yields wrapped, expanded, av(x) rules with
    unioned permission sets.
    z/Expanded {0.ruletype} rules for {0.policy}: {1})r+   r0   r!   ÚKeyErrorrU   Z	getLoggerr   ÚdebugrP   ÚlenÚkeys)r3   ZWrapperClassrA   r7   Zexpanded_ruleZexpanded_wrapped_ruler   r   r    Ú_avxrule_expand_generator  s    

r`   c                s   t jˆ ƒ‰ ‡ fdd„}|S )z™
    This is a template for the extended permission access vector diff functions.

    Parameters:
    ruletype    The rule type, e.g. "allowxperm".
    c       
   	      s  | j jdjˆ | ƒƒ | j s$| j r,| jƒ  | jt| jˆ  tƒt| jˆ  tƒdd�\}}}g }x^|D ]V\}}| j|j	|j	dd�\}}}	|sŽ|rd|j
t|jt|ƒt|ƒtdd„ |	D ƒƒƒƒ qdW t| djˆ ƒtdd„ |D ƒƒƒ t| djˆ ƒtd	d„ |D ƒƒƒ t| d
jˆ ƒ|ƒ dS )z6Generate the difference in rules between the policies.zCGenerating {0} differences from {1.left_policy} to {1.right_policy}F)Zunwrapc             s   s   | ]}|d  V  qdS )r   Nr   )r#   r$   r   r   r    ú	<genexpr>Q  s    z2avx_diff_template.<locals>.diff.<locals>.<genexpr>z
added_{0}sc             s   s   | ]}|j V  qd S )N)Úorigin)r#   Úar   r   r    ra   S  s    zremoved_{0}sc             s   s   | ]}|j V  qd S )N)rb   )r#   Úrr   r   r    ra   T  s    zmodified_{0}sN)rN   rO   rP   rQ   rR   rS   Ú	_set_diffr`   ÚAVRuleXpermWrapperr!   rG   rH   rb   r
   rW   Úset)
rX   rJ   rK   ÚmatchedrL   Ú	left_ruleÚ
right_ruler   r   r   )rI   r   r    rY   3  s,    

  zavx_diff_template.<locals>.diff)r   rZ   )rI   rY   r   )rI   r    Úavx_diff_template)  s    
$rk   c                s   t jˆ ƒ‰ ‡ fdd„}|S )zƒ
    This is a template for the type_* diff functions.

    Parameters:
    ruletype    The rule type, e.g. "type_transition".
    c                sÔ   | j jdjˆ | ƒƒ | j s$| j r,| jƒ  | j| j| jˆ  tƒ| j| jˆ  tƒƒ\}}}g }x:|D ]2\}}t	|j
ƒt	|j
ƒkrd|jt||j
|j
ƒƒ qdW t| djˆ ƒ|ƒ t| djˆ ƒ|ƒ t| djˆ ƒ|ƒ dS )z6Generate the difference in rules between the policies.zCGenerating {0} differences from {1.left_policy} to {1.right_policy}z
added_{0}szremoved_{0}szmodified_{0}sN)rN   rO   rP   rQ   rR   rS   re   Z_expand_generatorÚTERuleWrapperr   ÚdefaultrG   Úmodified_terule_recordrW   )rX   rJ   rK   rh   rL   ri   rj   )rI   r   r    rY   d  s"    
zte_diff_template.<locals>.diff)r   rZ   )rI   rY   r   )rI   r    Úte_diff_templateZ  s    
ro   c               @   s�  e Zd ZdZedƒZedƒZedƒZedƒZ	edƒZ
edƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZed	ƒZed	ƒZed	ƒZed
ƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZ edƒZ!edƒZ"edƒZ#edƒZ$edƒZ%edƒZ&e'dƒZ(edƒZ)edƒZ*edƒZ+e'dƒZ,edƒZ-edƒZ.edƒZ/e'dƒZ0edƒZ1edƒZ2edƒZ3e4e5ƒZ6e4e5ƒZ7dd„ Z8dd„ Z9dS )ÚTERulesDifferencezV
    Determine the difference in type enforcement rules
    between two policies.
    ZallowÚdiff_allowsZ
auditallowÚdiff_auditallowsZ
neverallowÚdiff_neverallowsZ	dontauditÚdiff_dontauditsZ
allowxpermÚdiff_allowxpermsZauditallowxpermÚdiff_auditallowxpermsZneverallowxpermÚdiff_neverallowxpermsZdontauditxpermÚdiff_dontauditxpermsZtype_transitionÚdiff_type_transitionsZtype_changeÚdiff_type_changesZtype_memberÚdiff_type_membersc             C   sà   | j jdj| ƒƒ x$| jjƒ D ]}| j|j j|ƒ qW x.| jjƒ D ] \}}| j jdjt	|ƒ|ƒƒ qDW | j jdj| ƒƒ x$| j
jƒ D ]}| j|j j|ƒ q†W x.| jjƒ D ] \}}| j jdjt	|ƒ|ƒƒ q¬W | j jdƒ dS )z$Create rule lists for both policies.z+Building TE rule lists from {0.left_policy}zLoaded {0} {1} rules.z,Building TE rule lists from {0.right_policy}z!Completed building TE rule lists.N)rN   r]   rP   Zleft_policyZterulesrQ   rI   rG   rA   r^   Zright_policyrR   )rX   r   rI   Zrulesr   r   r    rS   Ç  s    z'TERulesDifference._create_te_rule_listsc             C   sê   | j jdƒ d| _d| _d| _d| _d| _d| _d| _d| _	d| _
d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _ d| _!d| _"| j#j$ƒ  | j%j$ƒ  dS )z%Reset diff results on policy changes.zResetting TE rule differencesN)&rN   r]   Úadded_allowsÚremoved_allowsÚmodified_allowsÚadded_auditallowsÚremoved_auditallowsÚmodified_auditallowsÚadded_neverallowsÚremoved_neverallowsÚmodified_neverallowsÚadded_dontauditsÚremoved_dontauditsÚmodified_dontauditsÚadded_allowxpermsÚremoved_allowxpermsÚmodified_allowxpermsÚadded_auditallowxpermsÚremoved_auditallowxpermsÚmodified_auditallowxpermsÚadded_neverallowxpermsÚremoved_neverallowxpermsÚmodified_neverallowxpermsÚadded_dontauditxpermsÚremoved_dontauditxpermsÚmodified_dontauditxpermsÚadded_type_transitionsÚremoved_type_transitionsÚmodified_type_transitionsÚadded_type_changesÚremoved_type_changesÚmodified_type_changesÚadded_type_membersÚremoved_type_membersÚmodified_type_membersrQ   rV   rR   )rX   r   r   r    Ú_reset_diffÛ  sH    
zTERulesDifference._reset_diffN):r   r   r   Ú__doc__r[   rq   r   r|   r}   r~   rr   r   r€   r�   rs   r‚   rƒ   r„   rt   r…   r†   r‡   rk   ru   rˆ   r‰   rŠ   rv   r‹   rŒ   r�   rw   rŽ   r�   r�   rx   r‘   r’   r“   ro   ry   r”   r•   r–   rz   r—   r˜   r™   r{   rš   r›   rœ   r   ÚlistrQ   rR   rS   r�   r   r   r   r    rp   ‚  sb   rp   c               @   s4   e Zd ZdZdZdd„ Zd	d
„ Zdd„ Zdd„ ZdS )rf   zEWrap extended permission access vector rules to allow set operations.r/   r1   r,   Ú
xperm_typer!   c             C   sH   || _ t|jƒ| _t|jƒ| _t|jƒ| _|j| _|j| _t|ƒ| _	d S )N)
rb   r   r/   r1   r   r,   r    r!   ÚhashÚkey)rX   r   r   r   r    Ú__init__  s    zAVRuleXpermWrapper.__init__c             C   s   | j S )N)r¢   )rX   r   r   r    Ú__hash__  s    zAVRuleXpermWrapper.__hash__c             C   s   | j |j k S )N)r¢   )rX   Úotherr   r   r    Ú__lt__  s    zAVRuleXpermWrapper.__lt__c             C   s0   | j |j ko.| j|jko.| j|jko.| j|jkS )N)r/   r1   r,   r    )rX   r¥   r   r   r    Ú__eq__  s    zAVRuleXpermWrapper.__eq__N)r/   r1   r,   r    r!   )	r   r   r   rž   Ú	__slots__r£   r¤   r¦   r§   r   r   r   r    rf     s   	rf   c               @   s4   e Zd ZdZdZdd	„ Zd
d„ Zdd„ Zdd„ ZdS )rl   z*Wrap type_* rules to allow set operations.r/   r1   r,   r)   r*   Úfilenamec             C   sž   || _ t|jƒ| _t|jƒ| _t|jƒ| _t|ƒ| _yt|j	ƒ| _	|j
| _
W n  tk
rl   d | _	d | _
Y nX y|j| _W n ttfk
r˜   d | _Y nX d S )N)rb   r   r/   r1   r   r,   r¡   r¢   r   r)   r*   r   r©   r   r	   )rX   r   r   r   r    r£   )  s    
zTERuleWrapper.__init__c             C   s   | j S )N)r¢   )rX   r   r   r    r¤   <  s    zTERuleWrapper.__hash__c             C   s   | j |j k S )N)r¢   )rX   r¥   r   r   r    r¦   ?  s    zTERuleWrapper.__lt__c             C   sH   | j |j koF| j|jkoF| j|jkoF| j|jkoF| j|jkoF| j|jkS )N)r/   r1   r,   r)   r*   r©   )rX   r¥   r   r   r    r§   B  s    zTERuleWrapper.__eq__N)r/   r1   r,   r)   r*   r©   )	r   r   r   rž   r¨   r£   r¤   r¦   r§   r   r   r   r    rl   #  s   rl   )-rU   Úcollectionsr   r   Úsysr   Úenumr   Z	exceptionr   r   r	   Z	policyrepr
   r   r)   r   Zdescriptorsr   Ú
differencer   r   r6   r   r   Zobjclassr   r&   r'   rH   rn   r   r.   r2   rT   r@   rF   rM   r[   r`   rk   ro   rp   rf   rl   r   r   r   r    Ú<module>   s@   Z&$01( 