h0dZddlmZddlZddlZddlZddlZddlZddlm Z ddlm Z ddl m Z ddl m Z ddlmZmZmZmZmZdd lmZdd lmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"dd l#m$Z$dd l%m&Z&dd l'm(Z(m)Z)ddl*m+Z+m,Z,m-Z-ddl.m/Z/m0Z0m1Z1m2Z2ddl3m4Z4m5Z5m6Z6m7Z7m8Z8ddl9m:Z:Gdde(Z;Gdde(Z<e dGddZ=Gdde(Z>Gdde(Z?Gdde(Z@Gd d!e(ZAdS)"u  This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program.  If not, see . Copyright © 2019 Cloud Linux Software Inc. This software is also available under ImunifyAV commercial license, see ) annotationsN) dataclass) attrgetter)Path)time)DictIterableListSetcast)reduce) SQL BooleanFieldCase CharFieldCheck Expression FloatFieldForeignKeyField IntegerFieldPrimaryKeyField TextFieldfn model_to_dict)UserType)Modelinstance) FilenameField ScanPathFieldapply_order_by)execute_iterable_expressionget_abspath_from_user_dirget_results_iterable_expressionsplit_for_chunk)FAILED_TO_CLEANUPMalwareHitStatusMalwareScanResourceTypeMalwareScanTypeVulnerabilityHitStatus) get_crontabc~eZdZdZGddZedZedZedZ ede d e j e je je je je je jfg Zedd Zedd Zedd Zedd Zede d ejjejjfg ZedZ edd Z!e" de j e je jfd ddZ#d S) MalwareScanzRepresents a batch of files scanned for malware Usually a single AI-BOLIT execution. See :class:`.MalwareScanType` for possible kinds of scans. c eZdZejZdZdS)MalwareScan.Meta malware_scansN__name__ __module__ __qualname__rdbdatabasedb_tableJ/opt/imunify360/venv/lib/python3.11/site-packages/imav/malwarelib/model.pyMetar/Rs;"r9r;T primary_keyFnullz type in {}r? constraintsrr?defaultNresource_type in {}c8ttSNintrr8r9r:zMalwareScan.sTVVr9)typespathsc v||j|j|j|j|j|j|j|j d|j |j | |j|k |j|k}|r-| |j |}| |j|j|j|jtj||}|t'|||}|dt+|fS)N scan_typeT clear_limit)selecttotal_resourcespathscanidstarted completederrortotal_malicioustypealias resource_typewherein_group_byorder_byr-desclimitoffsetr!countlistdicts) clssincetorarbr_rKrLquerys r: ondemand_listzMalwareScan.ondemand_listsd" JJ#    #{++!  U38<<&& ' ' U3;%' ( ( U3;"$ % % "  5KK U 3 344E NN#SXsz3;  Xk)..00 1 1 U5\\ VF^^   "8S%88E{{t{,,d5;;==.A.AAAr9rG)$r2r3r4__doc__r;rrTrrUrVrformatr) ON_DEMANDREALTIMEMALWARE_RESPONSE BACKGROUNDRESCANUSERRESCAN_OUTDATEDrYrRr rSrrWrXr(DBvalueFILEr[ initiator timestamp classmethodrjr8r9r:r-r-Ks ######## Y4 ( ( (Fl&&&G $'''I 9  E##'1'0'8'2'.','7        D&#lq999O =dB / / /D I4 . . .E"lq999OI  E%,,/28/4:       M t$$$I %1D1DEEEI /B  %  &   /B/B/B/B[/B/B/Br9r-c eZdZdZGddZeZeedddZ e dZ e dZ e dZe dZedd Ze d Ze d Zed Ze ej Zed Ze ded ejjejjfg Z e d Z!e d Z"e d Z#e d Z$e d Z%e&dZ'GddZ(e) d>dZ*e) d?dZ+e)d@dZ,e)dddZ-e)d@dZ.e)dAdZ/e)dBdZ0e)dCd Z1e)d!Z2e) dDd"Z3e)dd#d$Z4e)dEd'Z5e)d(Z6d)Z7e)dFdGd+Z8e)dHd.Z9e)d/Z:e)dCd0Z;e)dCd1Ze)d4Z?e)d5Z@eAdId;ZBd<ZCd=ZDdS)J MalwareHitz*Represents a malicious or suspicious file.c eZdZejZdZdS)MalwareHit.Meta malware_hitsNr1r8r9r:r;r}s;!r9r;FhitsCASCADEr? related_name on_deleter>rBTrCrEr@cTtt|j}t|SrGr str orig_filerselfrs r:orig_file_pathzMalwareHit.orig_file_pathdn-- Ir9c$eZdZedZdS)MalwareHit.OrderByc ttjtjdftjdftjdftjdftjdffdfS)Nrd) rr{statusr'CLEANUP_PENDINGCLEANUP_STARTEDFOUND CLEANUP_DONECLEANUP_REMOVEDr8r9r:rzMalwareHit.OrderBy.statussb%)91=)91=)/3)6:)91=     r9N)r2r3r4 staticmethodrr8r9r:OrderByrs-       r9rrNc , ||tt}|p t}|tj|ktj|kzg}|5d|d}|t d|f|j|zz|#|tj|k|#|tj |k| "|tj | z| rω r||j dk||j  fd| D}|rrg}g}|D]/}|d||d0d|}|t d|d|ttj|}|}| "|tj| z}||||}| t-| t|}||}d |D}||fS) N%CAST(orig_file AS TEXT) LIKE ?filec~g|]9}t|tk"|7|:Sr8)len startswith).0p site_searchs r: z)MalwareHit._hits_list..EsMq66C ,,,,k1J1J,,,,r9zorig_file NOT LIKE ?z AND ()c6g|]}|Sr8as_dictrrows r:rz)MalwareHit._hits_list..l 333C#++--333r9)rQr-joinrrUappendruserr{rTrr[rrr operatorand_idr]r\rarbr! _hits_num)rfclausesrgrhrarbsearch by_scan_idrr_ by_statusidsr user_siteskwargsrwhere_conditionspattern longer_paths sql_chunks sql_paramsrScombined_sql_string full_clausesmax_count_clausesordered max_countresults ` r: _hits_listzMalwareHit._hits_lists$zz#{++00== \466   E )k.AR.G H   #&mmmG  # #4wjAA8W$&       # #JOt$; < < <  !  # #K$6*$D E E E   # #J$5$B C C C  +   # #C$5$? @ @ @  # #CM$<$<[$I$I J J J#L    (22D%%&<===%%jjj1111&-ll:&>&># ''2/222J?? hm-=>> ) ? JM--c22 2L**\**0077>>vFF  $Xz7CCGMM"344 337333&  r9cx|r&|r$|tj|ktj|kzz}|||j|kz}|t j|jt|}|t|t|}| SrG) r-rUrrQrCOUNTrrr\r!r{scalar)rfrrgrhrr_qs r:rzMalwareHit._hits_numps  R   +u4#r) G   sx4' 'G JJrx'' ( ( - -k : : @ @ I I  xQ77Axxzzr9c||jtj|jz|||SrG)rrnot_inr'CLEANUP malicious)rfrgrhrs r: malicious_numzMalwareHit.malicious_nums?}} Z  /7 8 83= H       r9)ignore_cleanedc|j}|r'||jtjz}|j|g|Ri|SrG)rrrr'rr)rfrargsrrs r:malicious_listzMalwareHit.malicious_listsR-  C sz(()9)ABB BGs~g7777777r9cFd|D}d}t|||||S)Ncg|] }|j Sr8rrs r:rz)MalwareHit.set_status..'''3'''r9cd|i}|||d<|jdi||j|S)Nr cleaned_atr8updater\rr])rrfrrfields_to_updates r: expressionz)MalwareHit.set_status..expressionU&  %1; .3:11 01177 3HH Hr9r")rfrrrrs r: set_statuszMalwareHit.set_statusF''$''' I I I+ c6:   r9 to_deleterdcFd|D}fd}t||S)Ncg|] }|j Sr8rrs r:rz/MalwareHit.delete_instances..s111SV111r9cj|SrG)deleter\rr])rrfs r:rz/MalwareHit.delete_instances..expressions+::<<%%cfjjoo66 6r9r)rfrrs` r:delete_instanceszMalwareHit.delete_instancessA11y111  7 7 7 7 7+:yAAAr9 to_updatec|D][}|D]D\}}|D]\}}t||||E\dSrG)itemssetattrsave)rfrdata _instancenew_fields_datafieldrus r:update_instanceszMalwareHit.update_instancess ! !D.2jjll ! !* ?$3$9$9$;$;55LE5Iue4444     ! ! !r9returnrc`|jtjg|jz}|SrG)rr]r'rr)rfrs r: is_infectedzMalwareHit.is_infecteds: JNN$*   m   r9c|jSrG)rrfs r: is_suspiciouszMalwareHit.is_suspiciouss  ~r9c Tfd}tt||||dS)Nc|j}|||j|z}nSr(||jt jz}n)r'||jt jz}|5t|tr|g}||j |z}| |SrG) rrr]rrr'r RESTORABLE isinstancerrrQr\) chunk_of_idsrfrrcleanuprestores r:rz/MalwareHit.malicious_select..expressionsmG'36::l333 G3:,,-=-EFFF G3:>>*:*EFFFdC((" 6D38<<---::<<%%g.. .r9T)exec_expr_with_empty_iterrdr$)rfrrrrrrs `` r:malicious_selectzMalwareHit.malicious_selectsS / / / / / / +Cdd      r9statusesc2fd}t||S)Ncj|}r|jz}|SrGrr]rrQr\filesrrfrs r:rz'MalwareHit.get_hits..expressionTm''..G 43:>>(333::<<%%g.. .r9r$rfr rrs` ` r:get_hitszMalwareHit.get_hits4 / / / / / / /z5AAAr9 hits_infor cxd|D}d|D}d|Dtttj|tj|}fd|D}|S)Ncg|] }|j Sr8rSrentrys r:rz*MalwareHit.get_db_hits..s333333r9cg|] }|j Sr8app_namers r:rz*MalwareHit.get_db_hits..s6665666r9c*g|]}|j|jfSr8rSrrs r:rz*MalwareHit.get_db_hits..s!JJJuuz5>2JJJr9c4g|]}|j|jfv|Sr8rr)rhit paths_appss r:rz*MalwareHit.get_db_hits..s3   CM3<#@J#N#NC#N#N#Nr9)rdr{rQr\rr]r)rfrrLappsrrs @r: get_db_hitszMalwareHit.get_db_hitss3333366I666JJ JJJ       U:'++E22 3 3 U:&**400 1 1           r9c.fd}t||S)Ncj|SrGrr\rr]r rfs r:rz*MalwareHit.delete_hits..expression/::<<%%cm&7&7&>&>?? ?r9rrfr rs` r: delete_hitszMalwareHit.delete_hits3 @ @ @ @ @+:u===r9cjt||SrG)rYget_pk_exprrs r:refreshzMalwareHit.refreshs"Dzz~~dmmoo...r9Iterable[MalwareHit]cLfd}tt||S)Nc}r3tt}|jd|DS)Ncg|] }|j Sr8rrrs r:rz?MalwareHit.refresh_hits..expression..s*B*B*Bc36*B*B*Br9)rQr-rr\rr])rrirfinclude_scan_infos r:rz+MalwareHit.refresh_hits..expressionsiJJLLE  G 3 4499+FF;;svzz*B*BT*B*B*BCCDD Dr9r)rfrr4rs` ` r: refresh_hitszMalwareHit.refresh_hitssC E E E E E E 3JEEFFFr9rxrIc||j|k|jt jz|jdzS)NF)rQr\rrr]r'CLEANEDis_null)rfrxs r: cleaned_sincezMalwareHit.cleaned_sinces^zz||!! ^y (z~~.677 9~%%e,, .   r9c||jtjjkSrG)rQr\r[r(rtrurs r:db_hitszMalwareHit.db_hitss4zz||!!  !8!;!A A   r9cv||jtjkS)z,Return db hits that are in queue for cleanup)r;r\rr'rrs r:db_hits_pending_cleanupz"MalwareHit.db_hits_pending_cleanup2{{}}"" J*: :   r9cv||jtjkS)z3Return db hits for which the cleanup is in progress)r;r\rr'rrs r:db_hits_under_cleanupz MalwareHit.db_hits_under_cleanupr>r9cv||jtjkS)z3Return db hits for which the restore is in progressr;r\rr'CLEANUP_RESTORE_STARTEDrs r:db_hits_under_restorationz$MalwareHit.db_hits_under_restoration"s2{{}}"" J*B B   r9c<d|D}d|D}d|D||j||j|}fd|DS)z Return db hits for which the cleanup is in progress specified by the provided set of MalwareDatabaseHitInfo ch|] }|j Sr8rrhit_infos r: z6MalwareHit.db_hits_under_cleanup_in..1s???hHM???r9ch|] }|j Sr8rrGs r:rIz6MalwareHit.db_hits_under_cleanup_in..2sGGGh)GGGr9c*h|]}|j|jfSr8rrGs r:rIz6MalwareHit.db_hits_under_cleanup_in..3s/   3;X]H- .   r9c4g|]}|j|jfv|Sr8r)rrpath_app_name_sets r:rz7MalwareHit.db_hits_under_cleanup_in..;s8    s|,0AAA AAAr9)r@r\rr]r)rf hit_info_setpath_set app_name_setrirMs @r:db_hits_under_cleanup_inz#MalwareHit.db_hits_under_cleanup_in)s@?,???GG,GGG   ?K     % % ' ' U3=$$X.. / / U3<##L11 2 2          r9cv||jtjkSrG)r;r\rr'CLEANUP_RESTORE_PENDINGrs r:db_hits_pending_cleanup_restorez*MalwareHit.db_hits_pending_cleanup_restoreA0{{}}"" J*B B   r9cv||jtjkSrGrBrs r:db_hits_under_cleanup_restorez(MalwareHit.db_hits_under_cleanup_restoreGrUr9 hit_list_listList['MalwareHit'] attributerDict[str, List['MalwareHit']]ctdtj|Dt |}dtj|t |DS)Nc3K|]}|VdSrGr8r3s r: z0MalwareHit.group_by_attribute..R" I ISS I I I I I Ir9keyc4i|]\}}|t|Sr8rdr attr_valuers r: z1MalwareHit.group_by_attribute..U4    D T    r9sorted itertoolschain from_iterablergroupbyrZrXhit_lists r:group_by_attributezMalwareHit.group_by_attributeM I IIO99-HH I I I9%%     $-$5y))%%%    r9cid|jd|jd|jd|jjd|jd|jjd|jd|jd |jd |j d |j d |j d |j did|j d|jd|j|j|j|jt$jjkrQt+t,t,jt,jt,jt,j|jkt,j|jkt,j|jkt,j |j kt,j|jkt,j|jkt,j|jkt,jdt,jdt,jd ngdS)Nrusernamercreatedscan_idrNr[rYhashsizerrr extra_datadb_namerdb_hostF)db_portsnippet table_fields) rrrrTrU scanid_idrYr[rvrwrrrryrrzr{r|r(rtrurdMalwareHistoryrQ table_name table_field table_row_infr\rSrur8rer-s r:rzMalwareHit.as_dict]s , $',  ,  DN,  t{* , t~ , ) ,  T/,  DI,  DI,  DI,  ,  dk,  $/,  ",  t|,  !, " t|#, $||,%)@)C)III)"))&1&2&4 U&/4=@&.$,>&.$,>&.$,>&+t~=&48JJ&.$+=&199%@@&2::5AA&4<   [ .)-BBBB[B   [ >>[> ///GGGG[G   [   [    [    [    [   [ .  [   [     \  - - - ^NNNNNr9r{T)frozenceZdZUdZded<ded<ded<ded<ded<d ed <ded <ded <d ed <ded<edZedZdS)MalwareHitAlternatezA Used as a replacement for MalwareHit for file hits only rrTrNonerrrrIrwrvrYrxboolrc |||d|d|d|d|d|ddd|ddd|ddd  S) Nrrrwrvrrmatchesrx suspicious) rTrrrrrwrvrYrxrr8)rfrTfilenamers r:createzMalwareHitAlternate.createsssw-ffffa+6l1ok2v,q/,77    r9cNttj|jSrG)rosfsdecoderr-s r:rz"MalwareHitAlternate.orig_file_pathsBK//000r9N) r2r3r4rk__annotations__ryrrrr8r9r:rrsKKKNNNNNNJJJ III III III IIINNNOOO   [  11X111r9rcJeZdZdZGddZdZeZeZ ede dgZ e dd Z ed Zefd Zefd Ze dddZeddZedZxZS)MalwareIgnorePathz+A path that must be excluded from all scansc$eZdZejZdZdZdS)MalwareIgnorePath.Metamalware_ignore_path)))rSr[TN)r2r3r4rr5r6r7indexesr8r9r:r;rs;(6r9r;NFzresource_type in ('file','db')r@c8ttSrGrHr8r9r:rJzMalwareIgnorePath.s#dff++r9rBct||j}||_dSrG)rdrQr_rSreCACHE)rfrs r: _update_cachezMalwareIgnorePath._update_caches>SZZ\\**3844::<<== r9c Rd|_tt|jdi|S)Nr8)rsuperrr)rfrrs r:rzMalwareIgnorePath.creates. 3u&,,3==f===r9c`d|_tt|SrG)rrrr)rfrs r:rzMalwareIgnorePath.deletes' &,,33555r9r[rc \||j} || |j|k} || |j|k} |-| |j|} || |j|k} || |} || |} |t||| } |t|} | |j t| dz|jt| kz|jtt|kz} | d} | d| DfS)N/TrOc,g|]}t|Sr8rrs r:rz:MalwareIgnorePath.paths_count_and_list..s - - -C]3   - - -r9)rQr_rSr\ added_datecontainsr[rbrar!r#rrr+rc) rfrarbrr[rrgrhr_r user_homers r:paths_count_and_listz&MalwareIgnorePath.paths_count_and_lists JJLL ! !#( + +  %/00A >",--A  ))&1122A  $)]:;;A    A  A  xa00A  1$77I$$S^^c%9::8s9~~-/8s;t#4#45557A GGG--  - -1 - - -  r9r List[str]c:|j|i|\}}d|DS)Ncg|] }|d Srr8rs r:rz/MalwareIgnorePath.path_list.. s111F 111r9)r)rfrr_ path_lists r:rzMalwareIgnorePath.path_lists1/s/@@@ 911y1111r9cK|j|t|}|jD]C}tjdd{Vt|d}||ks ||jvrdSDdS)zChecks whether path stored in MalwareIgnorePath cache or if it's belongs to path from cache or if it matches patters from cache :param str check_path: path to check :return: bool: is ignored according MalwareIgnorePath NrrSTF)rrrasynciosleepparents)rf check_pathrSr ignored_paths r:is_path_ignoredz!MalwareIgnorePath.is_path_ignored s 9       J  A-"" " " " " " " "& ??L $$,$,*F*Ftt+Gur9)NNNNNNNN)r[r)rr)r2r3r4rkr;rrrrrSrr[rrryrrrrrr __classcell__)rs@r:rrs5577777777 E   B 9;;DI 'G!H!H IM52E2EFFFJ[>>>>[>6666[6!  & & & & [& P222[2[r9rc eZdZdZGddZedZedZede d e j j e jj fge jj ZedZedZedZedZedZedd ZedZedZedZedZedZedZedZe dd Zed Z eddZ!eddZ"d S)rz:Records every event related to :class:`MalwareHit` recordsc eZdZejZdZdS)MalwareHistory.Metamalware_historyNr1r8r9r:r;r"s;$r9r;Fr>TrE)r?rArCc8ttSrGrHr8r9r:rJzMalwareHistory.CsS[[r9rBNc|j|k|j|kz}|r/||j|td|fzz}|r||j|kz}|||| } |t|t| } t| } | d| fS)Nz(INSTR(path, ?))TrO)ctimeeventrr file_userrQr\rarbrer!rrdrc) rfrgrhrarbrrr_rri list_results r: get_historyzMalwareHistory.get_historySs9%#)r/:    **622& 22 G  - s}, ,G ""7++11%88??GGMMOO  "8^UCCE5kk {{t{,,k99r9c |jd|ddp tj|ddp tj|ddpt jjd| dS)Nrwcauser[)rwrr[r8) insertpoprROOTr)MANUALr(rvruexecute)rfrs r: save_eventzMalwareHistory.save_eventgs  jjd33Dx}**Wd++E/E **_d;;2&+1      ')))))r9r List[dict]c tj5t|dt |jjzD])}||* ddddS#1swxYwYdS)Ni) chunk_size) rr5atomicr%r_metacolumns insert_manyr)rfr hits_chunks r: save_eventszMalwareHistory.save_eventsqs [   ! ! 6 6 .CI,=(>(>!> 6 6  ++335555 6  6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6sABB BrLrdrgrIc>||jtj|j||jtkz|j|kz |j SrG) rQrSrrr\r]rr&rr^tuples)rfrLrgs r:get_failed_cleanup_events_countz.MalwareHistory.get_failed_cleanup_events_count}s{ JJsx , , U U##9 1139%' Xch   VXX r9)NNN)rr)rLrdrgrI)#r2r3r4rkr;rrSrrrrlr(rtrurvr[rrrw file_ownerrrrrzr{ryrrrruryrrrrr8r9r:rrs:DD%%%%%%%% =e $ $ $Dyd###HI  E%,,/28/4:    (,2   M I5 ! ! !E I5 ! ! !E u%%%I&&&J u%%%I Le-@-@ A A AEiT"""GiT"""GiT"""G%%%J)&&&K Ld+++MiT"""GHL:::[:&[ 6 6 6[ 6    [    r9rcHeZdZdZGddZeZeedddZ e dZ e dZ e dZe dZe d Ze d Zed Ze ej Zed Zed Zed$dZed%dZedddZedZe d&dZedZ e!d'dZ"ed(d!Z#ed)d"Z$d#Z%dS)*VulnerabilityHitzRepresents a vulnerable file.c eZdZejZdZdS)VulnerabilityHit.Metavulnerability_hitsNr1r8r9r:r;rs;'r9r;Fvulnerabilitiesrrr>TrcTtt|j}t|SrGrrs r:rzVulnerabilityHit.orig_file_pathrr9 signaturerrrc,|dS)Nz VULN-ESUS-)r)rfrs r:matchzVulnerabilityHit.matchs##L111r9rdctjd|x}r-|ddSgS)NzVULN-ESUS-([\d,]+)r,)rergroupssplit)rfrrs r:get_vulnerability_idsz&VulnerabilityHit.get_vulnerability_idssBI3Y?? ?5 0<<>>!$**3// / r9Nrc2fd}t||S)Ncj|}r|jz}|SrGr r s r:rz-VulnerabilityHit.get_hits..expressionr r9r rs` ` r:rzVulnerabilityHit.get_hitsrr9c.fd}t||S)Ncj|SrGr$r%s r:rz0VulnerabilityHit.delete_hits..expressionr&r9rr's` r:r(zVulnerabilityHit.delete_hitsr)r9rc  d||tt} |p t}d|} tj|ktj|kz}||t d| f|j| zzz}|||j|kz}|||j|kz}| ||j | zz}|}| ||j | z}| | ||}|t|||}|t!j|j t |}d|D}||fS)Nz%{}%rc6g|]}|Sr8rrs r:rz/VulnerabilityHit._hits_list..rr9)rQr-rrrlrUrrrTrrr]r\rarbr!rrr)rfrgrhrarbrrrr_rrrrrrrrrrs r:rzVulnerabilityHit._hits_listszz#{++00== \466--''#+u4  2 %    C07*7"$ $L   CH, ,L  ! CJ*4 4L  CJ)3 3L( ? CFJJsOO +L**\**0077>>vFF  $XsG<. r_r9r`c4i|]\}}|t|Sr8rcrds r:rfz7VulnerabilityHit.group_by_attribute..rgr9rhrns r:rpz#VulnerabilityHit.group_by_attributerqr9r list[int]ct}|D]2}|tt|dz}3t|S)NrY)setrrrd)rfrvuln_idsrs r:get_vulnerabilities_idsz(VulnerabilityHit.get_vulnerabilities_idssU55  C  66s6{CC HHH~~r9cFd|D}d}t|||||S)Ncg|] }|j Sr8rrs r:rz/VulnerabilityHit.set_status.."rr9cd|i}|||d<|jdi||j|S)Nr patched_atr8r)rrfrrrs r:rz/VulnerabilityHit.set_status..expression$rr9r)rfrrrrs r:rzVulnerabilityHit.set_status rr9c |j|j|j|jj|j|jj|j|j|j|j |j d S)N) rrs file_pathrtrurNrYrvrwrr) rrrrTrUr~rYrvrwrrr-s r:rzVulnerabilityHit.as_dict1sN' {*~)IIIk/   r9)rrrr)rrrrd) rNNNNNNNNN)rXrrZrrr)rrdrrrG)&r2r3r4rkr;rrrr-rTrrrrrrYrvrwrrxr* VULNERABLErrrrryrrrr(rrdrrprrrr8r9r:rrs''((((((((   B _ & F I5 ! ! !E 9% D 5)))I 9% D 9$   D 9$   D %%%IY5@ A A AF&&&J X222[2[ )-BBBB[B>>[>    1!1!1![1!f//[/    \  [   [      r9rcDeZdZdZGddZedZdS)ImunifyPatchSubscriptionz(Stores Imunify Patch user subscriptions.c eZdZejZdZdS)ImunifyPatchSubscription.Metaimunify_patch_subscriptionsN)r2r3r4rr5r6rr8r9r:r;rDs;2 r9r;Tr<N)r2r3r4rkr;ruser_idr8r9r:rrAsP2233333333iD)))GGGr9r)Brk __future__rrrjrrr dataclassesrrpathlibrrtypingrr r r r functoolsr peeweerrrrrrrrrrrrplayhouse.shortcutsr defence360agent.contracts.configrdefence360agent.modelrr$defence360agent.model.simplificationrr r!defence360agent.utilsr"r#r$r%imav.malwarelib.configr&r'r(r)r*imav.malwarelib.scan.crontabr+r-r{rrrrrr8r9r:rs*#""""" !!!!!!22222222222222                            .-----55555511111111  544444rBrBrBrBrB%rBrBrBjSNSNSNSNSNSNSNSNl $"1"1"1"1"1"1"1"1J````````Fi i i i i Ui i i Xs s s s s us s s l*****u*****r9