55 lines
2.0 KiB
Plaintext
55 lines
2.0 KiB
Plaintext
Creating temporary files using insecure methods exposes the application to race conditions on filenames: a malicious user can try to create a file with a predictable name before the application does. A successful attack can result in other files being accessed, modified, corrupted or deleted. This risk is even higher if the application run with elevated permissions.
|
||
|
||
|
||
In the past, it has led to the following vulnerabilities:
|
||
|
||
* https://nvd.nist.gov/vuln/detail/CVE-2014-1858[CVE-2014-1858]
|
||
* https://nvd.nist.gov/vuln/detail/CVE-2014-1932[CVE-2014-1932]
|
||
|
||
``++Path.GetTempFileName()++`` generates predictable file names and is inherently unreliable and insecure. Additionally, the method will raise an ``++IOException++`` if it is used to create more than 65535 files without deleting previous temporary files.
|
||
|
||
== Recommended Secure Coding Practices
|
||
|
||
Out of the box, .NET is missing secure-by-design APIs to create temporary files. To overcome this, one of the following options can be used:
|
||
|
||
* Use a dedicated sub-folder with tightly controlled permissions
|
||
* Created temporary files in a publicly writable folder and make sure:
|
||
** Generated filename is unpredictable
|
||
** File is readable and writable only by the creating user ID
|
||
** File descriptor is not inherited by child processes
|
||
** File is destroyed as soon as it is closed
|
||
|
||
== Noncompliant Code Example
|
||
|
||
[source,vbnet]
|
||
----
|
||
Dim TempPath = Path.GetTempFileName() 'Noncompliant
|
||
|
||
Using Writer As New StreamWriter(TempPath)
|
||
Writer.WriteLine("content")
|
||
End Using
|
||
----
|
||
|
||
== Compliant Solution
|
||
|
||
[source,vbnet]
|
||
----
|
||
Dim RandomPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName())
|
||
|
||
Using FileStream As new FileStream(RandomPath, FileMode.CreateNew, FileAccess.Write, FileShare.None, 4096, FileOptions.DeleteOnClose)
|
||
Using Writer As New StreamWriter(FileStream)
|
||
Writer.WriteLine("content")
|
||
End Using
|
||
End Using
|
||
----
|
||
|
||
include::../see.adoc[]
|
||
|
||
ifdef::env-github,rspecator-view[]
|
||
'''
|
||
== Comments And Links
|
||
(visible only on this page)
|
||
|
||
include::../comments-and-links.adoc[]
|
||
endif::env-github,rspecator-view[]
|