관리-도구
편집 파일: safe_fileops.cpython-311.pyc
� ���'��5�ݥ������������� ������������d�dl�Z�d�dlZd�dlZd�dlZd�dlZd�dlZd�dlZd�dlmZ�d�dl m Z mZ�d�dlm Z �d�dlmZmZ�d�dlmZ�ej��������Zej��������ej��������z��ej��������z��Zd��Z�G�d��d e������������Zd ��Zd"d�Zd efd�Zd edefd�Z d edefd�Z!d efd�Z"�eej#��������������������Z#�eej$��������������������Z$e d#d���������������Z%e d����������������Z&e defd���������������Z'e d$deee(f���������fd���������������Z)e dede(de(de*fd���������������Z+deeee(f���������ee(df���������f���������deeee(f���������ee(df���������f���������fd �Z, � � � � �d%dedefd!�Z-dS�)&�����N)�ProcessPoolExecutor)�contextmanager�suppress)�chain)�Tuple�Union)�utilsc�����������������������t����������j��������g��������������t����������j��������|�������������t����������j��������|��������������|�|��S��N)�os� setgroups�setgid�setuid)�fun�uid�gid�argss��� �W/opt/imunify360/venv/lib/python3.11/site-packages/defence360agent/utils/safe_fileops.py�dropr������s8�������L������I�c�N�N�N��I�c�N�N�N��3��:������c�������������������������e�Zd�ZdS�)�UnsafeFileOperationN)�__name__� __module__�__qualname__��r���r���r���r������s���������������Dr���r���c�����������������������t����������j��������t����������|�������������������������}|j��������t ����������j����������������������k�����rt ����������dt����������|�������������z����������������dS�)Nz The file belongs to admin user: T)r����stat�str�st_uidr ����get_min_uidr���)�file�sts��� r����check_non_admin_filer$������sT������ ���T��� � �B� �y�5�$�&�&�&�&�!�.��T���:� �� �� ���4r���Fc���������������������������fd�}|S�)Nc������������������P��������t����������j����������������������d�d����fd� ��������������}|S�)N)�loopc������������������`���K����t�����������j�����������������������������|�������������s� st����������d|�z����������������t ����������j��������|�������������}t ����������t����������|j��������������������|g������������}� rt����������|j��������������������}|D�]I}t����������j ��������t����������|������������������������}|j��������dk����r|j��������dk����r|j��������|j��������}}�n �Jt����������dt����������|������������z����������������|pt����������j����������������������}�|j��������t#����������d�������������t$����������� |||�g|�R�����d�{V���S�)NzNo such file or directory: r���z"Unsafe file operation under root: ������max_workers)r����path�exists�FileNotFoundError�pathlib�Pathr����reversed�parentsr���r���r ����st_gidr����asyncio�get_event_loop�run_in_executorr���r���)�filenamer'���r���r,����paths�pr#���r���r���r���� missing_oks��� ��r����wrapperz$safe.<locals>._safe.<locals>.wrapper)���sa�����������7�>�>�(�+�+�� �J�� �'�1�H�<��������<��)�)�D��(�4�<�0�0�4�&�9�9�E��� /� ���.�.���� �� ���W�S��V�V�_�_���9��>�>�b�i�1�n�n�!�y�"�)��C��E��)�8�3�t�9�9�D��������3�7�1�3�3�D�-��-�#��2�2�2������ ��������������������� r���)� functools�wraps)r���r;���r:���s���` �r����_safezsafe.<locals>._safe(���sK�������� ��� � �04�� �� �� �� �� �� �� �� � � �>��r���r���)r:���r>���s���` r����safer?���'���s$�������!��!��!��!��!�F��Lr���r7���c������������������R�����t����������j��������|�������������������������������������������������d�S�r���)r/���r0����touch�r7���s��� r����_touchrC���N���s$�������L���� � �"�"�"�"�"r����datac������������������T�����t����������j��������|����������������������������������|�������������d�S�r���)r/���r0���� write_text�r7���rD���s��� r����_write_textrH���R���s&�������L����%�%�d�+�+�+�+�+r���c�������������������b���K������t����������d�������������t����������������������|�|��������������d�{V���S��NT)r:���)r?���rH���rG���s��� r���rF���rF���Y���s@����������3�&���&�&�&�{�3�3�H�d�C�C�C�C�C�C�C�C�Cr���c�������������������`���K������t����������d�������������t����������������������|���������������d�{V���S�rJ���)r?���rC���rB���s��� r���rA���rA���]���s>����������.�&���&�&�&�v�.�.�x�8�8�8�8�8�8�8�8�8r���Tc��������������#������K����d|v�rt����������d�������������t����������|�|������������5�}t����������j��������|�����������������������������������������������}t����������j��������|������������}t����������j��������d���������������������|�����������������������������������������������������������}|�|k����s|j ��������|j ��������k����r"t����������d���������������������|��������������������������|rTt����������j��������|j ��������������������t����������j��������|�������������j��������vr"t����������d���������������������|��������������������������|V���d�d�d��������������d�S�#�1�swxY�w�Y���d�S�)N�wz'w' mode is not permitted�/proc/self/fd/{}zUnable to safely read {}z5Unable to sefely read {}. File is not in user homedir)r����openr����fstat�fileno�pwd�getpwnam�readlink�formatr ����pw_uidr/���r0����pw_dirr2���)r7����mode�user�respect_homedir�fr#����passwd� real_paths��� r����safe_open_filer^���e���s���������� �d�{�{�!�"=�>�>�>� �h�� � ���� �X�a�h�h�j�j� !� !����d�#�#���K� 2� 9� 9�!�(�(�*�*� E� E�F�F� �� � �!�!�r�y�F�M�'A�'A�%�*�1�1�(�;�;����� � � � ���V�]�+�+��<��)�)�1�2��2��&�G�N�N��������� � �����1�������������������������������������s����DD9�9D=��D=c���������������/����B��K����t����������j��������|�i�|��} �|V���t����������t����������������������5��t����������j��������|�������������ddd�������������dS�#�1�swxY�w�Y���dS�#�t����������t����������������������5��t����������j��������|�������������ddd�������������w�#�1�swxY�w�Y���w�xY�w)z� Context manager which wraps os.open and close file descriptor at the end :param args: positional arguments for os.open :param kwargs: keyword arguments for os.open N)r���rO���r����OSError�close)r����kwargs�fds��� r����open_fdrd�������s!���������� ��$� !�&� !� !�B������ �g� � �� �� ��H�R�L�L�L� �� �� �� �� �� �� �� �� �� �� �� ����� �� �� �� �� �� ��X�g� � �� �� ��H�R�L�L�L� �� �� �� �� �� �� �� �� �� �� ����� �� �� �� �� ���s@����A��A�A�A�B�1B�B�B�B�B�B�namec��������������/��������K����t����������|�g|�R�dt����������j��������i|��5�}t����������j��������d���������������������|������������������������}|�|k����rt����������d�������������|V���ddd�������������dS�#�1�swxY�w�Y���dS�)a �� Context manager to get a directory file descriptor It also checks if a directory doesn't contain a symlink in the path :param name: full directory name :param args: positional arguments for os.open :param kwargs: keyword arguments for os.open �flagsrN���z%Operations on symlinks are prohibitedN)rd���r����O_DIRECTORYrT���rU���r���)re���r���rb����dir_fd�reals��� r���� opendir_fdrk�������s������������ �� =�� =� =� =�B�N� =�f� =� =�����{�-�4�4�V�<�<�=�=���4�<�<�%�&M�N�N�N����� �������������������������������������s����AA-�-A1�4A1r[���c����������� ���#������K����d}t����������|�t����������������������r�t����������t����������������������5��t ����������j��������|�|�������������}t ����������j��������|�|j��������t ����������j��������z��t ����������j ��������z��|��������������ddd�������������n#�1�swxY�w�Y���t ����������j ��������|�||�������������}�t����������|�|�������������5�}|pt ����������j��������|�������������|_�������� �|V���|rGt����������t����������������������5��t ����������j��������|�|j����������������������ddd�������������n#�1�swxY�w�Y���nO#�|rHt����������t����������������������5��t ����������j��������|�|j����������������������ddd�������������w�#�1�swxY�w�Y���w�w�xY�wddd�������������dS�#�1�swxY�w�Y���dS�)a��� Context manager to open file object from file name or from file descriptor File object extended with 'st' attribute that contains os.stat_result of the opened file :param f: file name or file descriptor to open :param dir_fd: directory descriptor, ignored if 'f' is a file descriptor :param flags: flags for os.open, ignored if 'f' is a file descriptor :param mode: mode for built-in open N�ri���)rX���ri���)rg���ri����rX���)� isinstancer���r���r`���r���r����chmod�st_mode�S_IRUSR�S_IWUSRrO���r#���)r[���ri���rg���rX���r#����fos��� r���� open_fobjru�������s����������� �B��!�S���� 3� �g� � �� �� ����6�*�*�*�B��H��� �T�\�1�D�L�@�� �� �� �� � �� �� �� �� �� �� �� �� �� �� ����� �� �� �� �� �G�A�U�6�2�2�2�� �a�d� � � ��1�r�� �b�g�a�j�j��� 1��H�H�H��� 1��g�&�&��1��1��H�Q�R�Z�0�0�0�0�1��1��1��1��1��1��1��1��1��1��1�����1��1��1��1������ 1��g�&�&��1��1��H�Q�R�Z�0�0�0�0�1��1��1��1��1��1��1��1��1��1��1�����1��1��1��1��1� 1����1��1��1��1��1��1��1��1��1��1��1��1�����1��1��1��1��1��1s�����A B�B�B�:F�D%�F�1D� F�D �F� D �!F�%E1�<E$ �E1�$E( �(E1�+E( �,E1�1F�F�Fri���rg����is_safec��������������#�������K����|r3t����������|�||�������������5�}|dfV���ddd�������������dS�#�1�swxY�w�Y���dS�|�|fV���dS�)z� If is_safe flag is True, open file descriptor using name and dir_fd If is_safe is False, return name and dir_fd as is )ri���rg���N)rd���)re���ri���rg���rv���rc���s��� r���� safe_tuplerx�������s��������������� �T�&�� 6� 6� 6�� �"��d�(�N�N�N� �� �� �� �� �� �� �� �� �� �� �� ����� �� �� �� �� �� ���F�l�����s����+�/�/�src�dstc������������������\����|�\��}}|\��}}t�����������|rdnt����������j��������z��} t����������||t����������d�������������5�} t����������||| d�������������5�}|r�|d������������������������t����������j��������| |�������������t����������|t����������������������r2t����������j ��������|� ����������������������������������| j��������j����������������������d�d�d��������������n#�1�swxY�w�Y���|r=t����������|t����������������������r(|r�|d������������������������t����������j ��������||��������������d�d�d��������������d�S�#�1�swxY�w�Y���d�S�)Nr����rb)ri���rg���rX����wbrn���r)���rm���)�W_FLAGSr����O_EXCLru����R_FLAGS�shutil�copyfileobjro���r���rp���rQ���r#���rq����unlink)ry���rz���� src_unlink� dst_overwrite�racecall�src_f� src_dir_fd�dst_f� dst_dir_fd�w_flags�src_fo�dst_fos��� r����_mover��������s���������E�:���E�:��m�:�����;�G� � �j��d� �� �� ��0� � ��*�G�$� �� �� �� B� ��� ����� � � ���v�v�.�.�.��%��%�%�� B��������v�y�/@�A�A�A�A� B�� B�� B�� B�� B�� B�� B�� B�� B�� B�� B����� B�� B�� B�� B���� 0�*�U�C�0�0�� 0��� ����� � � ��I�e�J�/�/�/�/�%0��0��0��0��0��0��0��0��0��0��0��0�����0��0��0��0��0��0s7����D!�A/C �>D!� C �D!�C �AD!�!D%�(D%c���������������������K����t�����������j�����������������������������|�������������\��}}t�����������j�����������������������������|������������\��} } t����������|������������5�}t����������| ������������5�}t ����������||t ����������|������������5�} t ����������| |t����������|������������5�}t����������j��������||�������������}t����������j ����������������������}|� ��������������������t����������d�������������t����������t����������|j��������|j��������| ||||� ��� ����������d�{V����|r*|r(|r�|d������������������������t����������j��������||��������������|r>t����������j��������| |j��������|j��������|��������������t����������j��������| |j��������|��������������d�d�d��������������n#�1�swxY�w�Y���d�d�d��������������n#�1�swxY�w�Y���d�d�d��������������n#�1�swxY�w�Y���d�d�d��������������d�S�#�1�swxY�w�Y���d�S�)Nrm���r)���r*���)r���r,����splitrk���rx���r����r~���r���r4���r5���r6���r���r���r����r ���r3���r�����chownrp���rq���)ry���rz����safe_src�safe_dstr����r����r�����src_dir�src_name�dst_dir�dst_namer����r����� src_tuple� dst_tuple�src_str'���s��� r���� safe_mover��������s*������������ � �c�*�*��G�X��� � �c�*�*��G�X� �G� � ��B� �J��-��-��B� �Z��*�g�x����B�� �J��*�g�x���� B�� ����*�5�5�5���%�'�'���"�"��A�.�.�.����M��M������ �� �� �� �� �� �� �� �� ���� 3�(�� 3��� ����� � � ��I�h�z�2�2�2�2��� B��H�X�v�}�f�m�J�O�O�O�O��H�X�v�~�j�A�A�A�A�=B��B��B��B��B��B��B��B��B��B��B�����B��B��B��B��B��B��B��B��B��B��B��B��B��B��B�����B��B��B��B��B��B��B��B��B��B��B��B��B��B��B�����B��B��B��B��B��B��B��B��B��B��B��B��B��B��B��B�����B��B��B��B��B��Bs����G�&F,�>F�CE> �2F�>F �F�F �F� F,�F�F,�F�F,� G�,F0 �0G�3F0 �4G�G�G)F)T)Nr���N)FFTFN).r4���r<���r���r/���rR���r����r����concurrent.futuresr���� contextlibr���r���� itertoolsr����typingr���r����defence360agentr ����O_RDONLYr�����O_TRUNC�O_CREAT�O_WRONLYr~���r���� Exceptionr���r$���r?���r���rC���rH���rF���rA���rp���r����r^���rd���rk����intru����boolrx���r����r����r���r���r����<module>r�������sA������������������ � � � ������� � � � �� � � � �������2��2��2��2��2��2��/��/��/��/��/��/��/��/������������������������������!��!��!��!��!��!� �+�� �*�r�z� !�B�K� /������� �� �� �� �� �)�� �� �� ������$��$��$��$�N#�S��#��#��#��#�,�#��,�S��,��,��,��,�D�s��D�#��D��D��D��D�9�#��9��9��9��9�� ��R�X���� ��b�i���������������<����������� �S�� �� �� ���� � �� 1�� 1��s�C�x��� 1�� 1�� 1���� 1�F�� �S�� �#�� �c�� �D�� �� �� ���� �0� �u�S�#�X���c�4�i� 0�0� 1�0� �u�S�#�X���c�4�i� 0�0� 1�0��0��0��0�H�� ��� �*B��*B� �*B� �*B��*B��*B��*B��*B��*Br���