...
var fs:FileStream = new FileStream();
fs.open(new File("config.properties"), FileMode.READ);
var decoder:Base64Decoder = new Base64Decoder();
decoder.decode(fs.readMultiByte(fs.bytesAvailable, File.systemCharset));
var password:String = decoder.toByteArray().toString();
URLRequestDefaults.setLoginCredentialsForHost(hostname, usr, password);
...
config.properties
poderá ler o valor de password
e determinar facilmente que esse valor foi codificado em base 64. Qualquer funcionário desonesto com acesso a essas informações poderá usá-las para invadir o sistema.
...
string value = regKey.GetValue(passKey).ToString());
byte[] decVal = Convert.FromBase64String(value);
NetworkCredential netCred =
new NetworkCredential(username,decVal.toString(),domain);
...
password
. Qualquer funcionário desonesto com acesso a essas informações poderá usá-las para invadir o sistema.
...
RegQueryValueEx(hkey, TEXT(.SQLPWD.), NULL,
NULL, (LPBYTE)password64, &size64);
Base64Decode(password64, size64, (BYTE*)password, &size);
rc = SQLConnect(*hdbc, server, SQL_NTS, uid,
SQL_NTS, password, SQL_NTS);
...
password64
e determinar facilmente que esse valor foi codificado em base 64. Qualquer funcionário desonesto com acesso a essas informações pode usá-las para invadir o sistema.
...
01 RECORDX.
05 UID PIC X(10).
05 PASSWORD PIC X(10).
05 LEN PIC S9(4) COMP.
...
EXEC CICS
READ
FILE('CFG')
INTO(RECORDX)
RIDFLD(ACCTNO)
...
END-EXEC.
CALL "g_base64_decode_inplace" using
BY REFERENCE PASSWORD
BY REFERENCE LEN
ON EXCEPTION
DISPLAY "Requires GLib library" END-DISPLAY
END-CALL.
EXEC SQL
CONNECT :UID
IDENTIFIED BY :PASSWORD
END-EXEC.
...
CFG
poderá ler o valor da senha e determinar facilmente que esse valor foi codificado em base 64. Qualquer funcionário desonesto com acesso a essas informações poderá usá-las para invadir o sistema.
...
file, _ := os.Open("config.json")
decoder := json.NewDecoder(file)
decoder.Decode(&values)
password := base64.StdEncoding.DecodeString(values.Password)
request.SetBasicAuth(values.Username, password)
...
config.json
poderá ler o valor de password
e determinar facilmente que esse valor foi codificado em base 64. Qualquer funcionário desonesto com acesso a essas informações pode usá-las para invadir o sistema.
...
Properties prop = new Properties();
prop.load(new FileInputStream("config.properties"));
String password = Base64.decode(prop.getProperty("password"));
DriverManager.getConnection(url, usr, password);
...
config.properties
poderá ler o valor de password
e determinar facilmente que esse valor foi codificado em base 64. Qualquer funcionário desonesto com acesso a essas informações poderá usá-las para invadir o sistema.
...
webview.setWebViewClient(new WebViewClient() {
public void onReceivedHttpAuthRequest(WebView view,
HttpAuthHandler handler, String host, String realm) {
String[] credentials = view.getHttpAuthUsernamePassword(host, realm);
String username = new String(Base64.decode(credentials[0], DEFAULT));
String password = new String(Base64.decode(credentials[1], DEFAULT));
handler.proceed(username, password);
}
});
...
...
obj = new XMLHttpRequest();
obj.open('GET','/fetchusers.jsp?id='+form.id.value,'true','scott','tiger');
...
plist
e a usa para descompactar um arquivo protegido por senha.
...
NSDictionary *dict= [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"]];
NSString *encoded_password = [dict valueForKey:@"encoded_password"];
NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:encoded_password options:0];
NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding];
[SSZipArchive unzipFileAtPath:zipPath toDestination:destPath overwrite:TRUE password:decodedString error:&error];
...
Config.plist
poderá ler o valor de encoded_password
e determinar facilmente que esse valor foi codificado em base 64.
...
$props = file('config.properties', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$password = base64_decode($props[0]);
$link = mysql_connect($url, $usr, $password);
if (!$link) {
die('Could not connect: ' . mysql_error());
}
...
config.properties
poderá ler o valor de password
e determinar facilmente que esse valor foi codificado em base 64. Qualquer funcionário desonesto com acesso a essas informações poderá usá-las para invadir o sistema.
...
props = os.open('config.properties')
password = base64.b64decode(props[0])
link = MySQLdb.connect (host = "localhost",
user = "testuser",
passwd = password,
db = "test")
...
config.properties
poderá ler o valor de password
e determinar facilmente que esse valor foi codificado em base 64. Qualquer funcionário desonesto com acesso a essas informações poderá usá-las para invadir o sistema.
require 'pg'
require 'base64'
...
passwd = Base64.decode64(ENV['PASSWD64'])
...
conn = PG::Connection.new(:dbname => "myApp_production", :user => username, :password => passwd, :sslmode => 'require')
PASSWD64
e determinar facilmente que esse valor foi codificado em base 64. Qualquer funcionário desonesto com acesso a essas informações poderá usá-las para invadir o sistema.
...
val prop = new Properties();
prop.load(new FileInputStream("config.properties"));
val password = Base64.decode(prop.getProperty("password"));
DriverManager.getConnection(url, usr, password);
...
config.properties
poderá ler o valor de password
e determinar facilmente que esse valor foi codificado em base 64. Qualquer funcionário desonesto com acesso a essas informações pode usá-las para invadir o sistema.plist
e a usa para descompactar um arquivo protegido por senha.
...
var myDict: NSDictionary?
if let path = NSBundle.mainBundle().pathForResource("Config", ofType: "plist") {
myDict = NSDictionary(contentsOfFile: path)
}
if let dict = myDict {
let password = base64decode(dict["encoded_password"])
zipArchive.unzipOpenFile(zipPath, password:password])
}
...
Config.plist
poderá ler o valor de encoded_password
e determinar facilmente que esse valor foi codificado em base 64.
...
root:qFio7llfVKk.s:19033:0:99999:7:::
...
...
...
Private Declare Function GetPrivateProfileString _
Lib "kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, ByVal lpDefault As String, _
ByVal lpReturnedString As String, ByVal nSize As Long, _
ByVal lpFileName As String) As Long
...
Dim password As String
...
password = StrConv(DecodeBase64(GetPrivateProfileString("MyApp", "Password", _
"", value, Len(value), _
App.Path & "\" & "Config.ini")), vbUnicode)
...
con.ConnectionString = "Driver={Microsoft ODBC for Oracle};Server=OracleServer.world;Uid=scott;Passwd=" & password &";"
...
Config.ini
poderá ler o valor de Password
e determinar facilmente que esse valor foi codificado em base 64. Qualquer funcionário desonesto com acesso a essas informações poderá usá-las para invadir o sistema.
...
*Get the report that is to be deleted
r_name = request->get_form_field( 'report_name' ).
CONCATENATE `C:\\users\\reports\\` r_name INTO dsn.
DELETE DATASET dsn.
...
..\\..\\usr\\sap\\DVEBMGS00\\exe\\disp+work.exe
", o aplicativo excluirá um arquivo crítico e travará imediatamente o sistema SAP.
...
PARAMETERS: p_date TYPE string.
*Get the invoice file for the date provided
CALL FUNCTION 'FILE_GET_NAME'
EXPORTING
logical_filename = 'INVOICE'
parameter_1 = p_date
IMPORTING
file_name = v_file
EXCEPTIONS
file_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
OPEN DATASET v_file FOR INPUT IN TEXT MODE.
DO.
READ DATASET v_file INTO v_record.
IF SY-SUBRC NE 0.
EXIT.
ELSE.
WRITE: / v_record.
ENDIF.
ENDDO.
...
..\\..\\usr\\sap\\sys\\profile\\default.pfl
" em vez de uma data válida, o aplicativo revelará todas as configurações padrão de parâmetros de perfil do servidor de aplicativos SAP, possivelmente provocando ataques mais refinados.../../tomcat/conf/server.xml
", que faz com que o aplicativo exclua um dos seus próprios arquivos de configuração.Exemplo 2: O código a seguir usa a entrada de um arquivo de configuração para determinar qual arquivo deve ser aberto e para gravar em um console de "Depuração" ou em um arquivo de log. Se o programa for executado com privilégios adequados, e usuários mal-intencionados puderem alterar o arquivo de configuração, eles poderão usar esse programa para ler qualquer arquivo no sistema que termine com a extensão
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var rName:String = String(params["reportName"]);
var rFile:File = new File("/usr/local/apfr/reports/" + rName);
...
rFile.deleteFile();
.txt
.
var fs:FileStream = new FileStream();
fs.open(new File(String(configStream.readObject())+".txt"), FileMode.READ);
fs.readBytes(arr);
trace(arr);
public class MyController {
...
public PageRerference loadRes() {
PageReference ref = ApexPages.currentPage();
Map<String,String> params = ref.getParameters();
if (params.containsKey('resName')) {
if (params.containsKey('resPath')) {
return PageReference.forResource(params.get('resName'), params.get('resPath'));
}
}
return null;
}
}
..\\..\\Windows\\System32\\krnl386.exe
", que fará com que o aplicativo exclua um importante arquivo do sistema Windows.Exemplo 2: O código a seguir usa a entrada de um arquivo de configuração para determinar qual arquivo deve ser aberto e ecoado de volta para o usuário. Se o programa for executado com privilégios adequados, e usuários mal-intencionados puderem alterar o arquivo de configuração, eles poderão usar esse programa para ler qualquer arquivo no sistema que termine com a extensão ".txt".
String rName = Request.Item("reportName");
...
File.delete("C:\\users\\reports\\" + rName);
sr = new StreamReader(resmngr.GetString("sub")+".txt");
while ((line = sr.ReadLine()) != null) {
Console.WriteLine(line);
}
../../apache/conf/httpd.conf
", que fará com que o aplicativo exclua o arquivo de configuração especificado.Exemplo 2: O código a seguir usa a entrada da linha de comando para determinar qual arquivo deve ser aberto e ecoado de volta para o usuário. Se o programa for executado com privilégios adequados, e usuários mal-intencionados puderem criar links flexíveis para o arquivo, eles poderão usar esse programa para ler a primeira parte de qualquer arquivo no sistema.
char* rName = getenv("reportName");
...
unlink(rName);
ifstream ifs(argv[0]);
string s;
ifs >> s;
cout << s;
...
EXEC CICS
WEB READ
FORMFIELD(FILE)
VALUE(FILENAME)
...
END-EXEC.
EXEC CICS
READ
FILE(FILENAME)
INTO(RECORD)
RIDFLD(ACCTNO)
UPDATE
...
END-EXEC.
...
..\\..\\Windows\\System32\\krnl386.exe
", que fará com que o aplicativo exclua um importante arquivo do sistema Windows.
<cffile action = "delete"
file = "C:\\users\\reports\\#Form.reportName#">
final server = await HttpServer.bind('localhost', 18081);
server.listen((request) async {
final headers = request.headers;
final path = headers.value('path');
File(path!).delete();
}
Example 1
, não há validação de headers.value('path')
antes de executar funções de exclusão em arquivos.../../tomcat/conf/server.xml
", que faz com que o aplicativo exclua um dos seus próprios arquivos de configuração.Exemplo 2: O código a seguir usa a entrada de um arquivo de configuração para determinar qual arquivo deve ser aberto e ecoado de volta para o usuário. Se o programa for executado com privilégios adequados, e usuários mal-intencionados puderem alterar o arquivo de configuração, eles poderão usar esse programa para ler qualquer arquivo no sistema que termine com a extensão
rName := "/usr/local/apfr/reports/" + req.FormValue("fName")
rFile, err := os.OpenFile(rName, os.O_RDWR|os.O_CREATE, 0755)
defer os.Remove(rName);
defer rFile.Close()
...
.txt
.
...
config := ReadConfigFile()
filename := config.fName + ".txt";
data, err := ioutil.ReadFile(filename)
...
fmt.Println(string(data))
../../tomcat/conf/server.xml
", que faz com que o aplicativo exclua um dos seus próprios arquivos de configuração.Exemplo 2: O código a seguir usa a entrada de um arquivo de configuração para determinar qual arquivo deve ser aberto e ecoado de volta para o usuário. Se o programa for executado com privilégios adequados, e usuários mal-intencionados puderem alterar o arquivo de configuração, eles poderão usar esse programa para ler qualquer arquivo no sistema que termine com a extensão
String rName = request.getParameter("reportName");
File rFile = new File("/usr/local/apfr/reports/" + rName);
...
rFile.delete();
.txt
.
fis = new FileInputStream(cfg.getProperty("sub")+".txt");
amt = fis.read(arr);
out.println(arr);
Example 1
à plataforma Android.
...
String rName = this.getIntent().getExtras().getString("reportName");
File rFile = getBaseContext().getFileStreamPath(rName);
...
rFile.delete();
...
../../tomcat/conf/server.xml
", que faz com que o aplicativo exclua um dos seus próprios arquivos de configuração.Exemplo 2: Este código usa a entrada do armazenamento local para determinar qual arquivo abrir e ecoar de volta ao usuário. Se os usuários mal-intencionados puderem alterar o conteúdo do armazenamento local, eles poderão usar o programa para ler qualquer arquivo no sistema que termine com a extensão
...
var reportNameParam = "reportName=";
var reportIndex = document.indexOf(reportNameParam);
if (reportIndex < 0) return;
var rName = document.URL.substring(reportIndex+reportNameParam.length);
window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
fs.root.getFile('/usr/local/apfr/reports/' + rName, {create: false}, function(fileEntry) {
fileEntry.remove(function() {
console.log('File removed.');
}, errorHandler);
}, errorHandler);
}, errorHandler);
.txt
.
...
var filename = localStorage.sub + '.txt';
function oninit(fs) {
fs.root.getFile(filename, {}, function(fileEntry) {
fileEntry.file(function(file) {
var reader = new FileReader();
reader.onloadend = function(e) {
var txtArea = document.createElement('textarea');
txtArea.value = this.result;
document.body.appendChild(txtArea);
};
reader.readAsText(file);
}, errorHandler);
}, errorHandler);
}
window.requestFileSystem(window.TEMPORARY, 1024*1024, oninit, errorHandler);
...
../../tomcat/conf/server.xml
", que faz com que o aplicativo exclua um dos seus próprios arquivos de configuração.Exemplo 2: O código a seguir usa a entrada de um arquivo de configuração para determinar qual arquivo deve ser aberto e ecoado de volta para o usuário. Se o programa for executado com privilégios adequados, e usuários mal-intencionados puderem alterar o arquivo de configuração, eles poderão usar esse programa para ler qualquer arquivo no sistema que termine com a extensão
val rName: String = request.getParameter("reportName")
val rFile = File("/usr/local/apfr/reports/$rName")
...
rFile.delete()
.txt
.
fis = FileInputStream(cfg.getProperty("sub").toString() + ".txt")
amt = fis.read(arr)
out.println(arr)
Example 1
à plataforma Android.
...
val rName: String = getIntent().getExtras().getString("reportName")
val rFile: File = getBaseContext().getFileStreamPath(rName)
...
rFile.delete()
...
- (NSData*) testFileManager {
NSString *rootfolder = @"/Documents/";
NSString *filePath = [rootfolder stringByAppendingString:[fileName text]];
NSFileManager *fm = [NSFileManager defaultManager];
return [fm contentsAtPath:filePath];
}
../../tomcat/conf/server.xml
", que faz com que o aplicativo exclua um dos seus próprios arquivos de configuração.Exemplo 2: O código a seguir usa a entrada de um arquivo de configuração para determinar qual arquivo deve ser aberto e ecoado de volta para o usuário. Se o programa for executado com privilégios adequados, e usuários mal-intencionados puderem alterar o arquivo de configuração, eles poderão usar esse programa para ler qualquer arquivo no sistema que termine com a extensão
$rName = $_GET['reportName'];
$rFile = fopen("/usr/local/apfr/reports/" . rName,"a+");
...
unlink($rFile);
.txt
.
...
$filename = $CONFIG_TXT['sub'] . ".txt";
$handle = fopen($filename,"r");
$amt = fread($handle, filesize($filename));
echo $amt;
...
../../tomcat/conf/server.xml
", que faz com que o aplicativo exclua um dos seus próprios arquivos de configuração.Exemplo 2: O código a seguir usa a entrada de um arquivo de configuração para determinar qual arquivo deve ser aberto e ecoado de volta para o usuário. Se o programa for executado com privilégios adequados, e usuários mal-intencionados puderem alterar o arquivo de configuração, eles poderão usar esse programa para ler qualquer arquivo no sistema que termine com a extensão
rName = req.field('reportName')
rFile = os.open("/usr/local/apfr/reports/" + rName)
...
os.unlink(rFile);
.txt
.
...
filename = CONFIG_TXT['sub'] + ".txt";
handle = os.open(filename)
print handle
...
../../tomcat/conf/server.xml
", que faz com que o aplicativo exclua um dos seus próprios arquivos de configuração.Exemplo 2: O código a seguir usa a entrada de um arquivo de configuração para determinar qual arquivo deve ser aberto e ecoado de volta para o usuário. Se o programa for executado com privilégios adequados, e usuários mal-intencionados puderem alterar o arquivo de configuração, eles poderão usar esse programa para ler qualquer arquivo no sistema que termine com a extensão
rName = req['reportName']
File.delete("/usr/local/apfr/reports/#{rName}")
.txt
.
...
fis = File.new("#{cfg.getProperty("sub")}.txt")
amt = fis.read
puts amt
../../tomcat/conf/server.xml
", que faz com que o aplicativo exclua um dos seus próprios arquivos de configuração.Exemplo 2: O código a seguir usa a entrada de um arquivo de configuração para determinar qual arquivo deve ser aberto e ecoado de volta para o usuário. Se o programa for executado com privilégios adequados, e usuários mal-intencionados puderem alterar o arquivo de configuração, eles poderão usar esse programa para ler qualquer arquivo no sistema que termine com a extensão
def readFile(reportName: String) = Action { request =>
val rFile = new File("/usr/local/apfr/reports/" + reportName)
...
rFile.delete()
}
.txt
.
val fis = new FileInputStream(cfg.getProperty("sub")+".txt")
val amt = fis.read(arr)
out.println(arr)
func testFileManager() -> NSData {
let filePath : String = "/Documents/\(fileName.text)"
let fm : NSFileManager = NSFileManager.defaultManager()
return fm.contentsAtPath(filePath)
}
..\conf\server.xml
", que faz com que o aplicativo exclua um dos seus próprios arquivos de configuração.Exemplo 2: O código a seguir usa a entrada de um arquivo de configuração para determinar qual arquivo deve ser aberto e ecoado de volta para o usuário. Se o programa for executado com privilégios adequados, e usuários mal-intencionados puderem alterar o arquivo de configuração, eles poderão usar esse programa para ler qualquer arquivo no sistema que termine com a extensão
Dim rName As String
Dim fso As New FileSystemObject
Dim rFile as File
Set rName = Request.Form("reportName")
Set rFile = fso.GetFile("C:\reports\" & rName)
...
fso.DeleteFile("C:\reports\" & rName)
...
.txt
.
Dim fileName As String
Dim tsContent As String
Dim ts As TextStream
Dim fso As New FileSystemObject
fileName = GetPrivateProfileString("MyApp", "sub", _
"", value, Len(value), _
App.Path & "\" & "Config.ini")
...
Set ts = fso.OpenTextFile(fileName,1)
tsContent = ts.ReadAll
Response.Write tsContent
...
Path.Combine
toma vários caminhos de arquivos como argumentos. Ele os concatena para obter um caminho completo, que normalmente é seguido por uma chamada para read()
ou write()
para esse arquivo. A documentação descreve vários cenários diferentes com base no fato de o primeiro ou os parâmetros restantes serem caminhos absolutos. Dado um caminho absoluto para o segundo parâmetro ou os restantes, Path.Combine()
retornará esse caminho absoluto. Os parâmetros anteriores serão ignorados. As implicações aqui são significativas para aplicativos que possuem código semelhante ao exemplo a seguir.
// Called with user-controlled data
public static bytes[] getFile(String filename)
{
String imageDir = "\\FILESHARE\images\";
filepath = Path.Combine(imageDir, filename);
return File.ReadAllBytes(filepath);
}
C:\\inetpub\wwwroot\web.config
), um invasor pode controlar qual arquivo é retornado pelo aplicativo.
...
" Add Binary File to
CALL METHOD lr_abap_zip->add
EXPORTING
name = p_ifile
content = lv_bufferx.
" Read Binary File to
CALL METHOD lr_abap_zip->get
EXPORTING
name = p_ifile
IMPORTING
content = lv_bufferx2.
...
Example 1
, não há nenhuma validação de p_ifile
antes da realização de funções de leitura/gravação nos dados dentro dessa entrada. Se o arquivo ZIP for originalmente colocado no diretório "/tmp/
" de um computador Unix, uma entrada ZIP for "../etc/hosts
" e o aplicativo for executado com as permissões necessárias, ele substituirá o arquivo hosts
do sistema. Isso, por sua vez, permitirá que o tráfego da máquina fosse para qualquer lugar desejado pelo invasor, por exemplo, de volta para a máquina do invasor.
public static void UnzipFile(ZipArchive archive, string destDirectory)
{
foreach (var entry in archive.Entries)
{
string file = entry.FullName;
if (!string.IsNullOrEmpty(file))
{
string destFileName = Path.Combine(destDirectory, file);
entry.ExtractToFile(destFileName, true);
}
}
}
Example 1
, não há nenhuma validação de entry.FullName
antes da realização de operações de leitura/gravação nos dados dentro dessa entrada. Se o arquivo Zip fosse originalmente colocado no diretório "C:\TEMP
", o nome de uma entrada Zip tivesse "..\
segmentos" e o aplicativo fosse executado com as permissões necessárias, ele substituiria os arquivos do sistema.
func Unzip(src string, dest string) ([]string, error) {
var filenames []string
r, err := zip.OpenReader(src)
if err != nil {
return filenames, err
}
defer r.Close()
for _, f := range r.File {
// Store filename/path for returning and using later on
fpath := filepath.Join(dest, f.Name)
filenames = append(filenames, fpath)
if f.FileInfo().IsDir() {
// Make Folder
os.MkdirAll(fpath, os.ModePerm)
continue
}
// Make File
if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
return filenames, err
}
outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
if err != nil {
return filenames, err
}
rc, err := f.Open()
if err != nil {
return filenames, err
}
_, err = io.Copy(outFile, rc)
// Close the file without defer to close before next iteration of loop
outFile.Close()
rc.Close()
if err != nil {
return filenames, err
}
}
return filenames, nil
}
Example 1
, não há nenhuma validação de f.Name
antes da realização de funções de leitura/gravação nos dados dentro dessa entrada. Se o arquivo Zip fosse originalmente colocado no diretório "/tmp/
" de um computador baseado em Unix, uma entrada Zip fosse "../etc/hosts
" e o aplicativo fosse executado com as permissões necessárias, ele substituiria o arquivo hosts
do sistema. Isso, por sua vez, permitiria que o tráfego da máquina fosse para qualquer lugar desejado pelo invasor, por exemplo, de volta para a máquina do invasor.
private static final int BUFSIZE = 512;
private static final int TOOBIG = 0x640000;
...
public final void unzip(String filename) throws IOException {
FileInputStream fis = new FileInputStream(filename);
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry zipEntry = null;
int numOfEntries = 0;
long total = 0;
try {
while ((zipEntry = zis.getNextEntry()) != null) {
byte data[] = new byte[BUFSIZE];
int count = 0;
String outFileName = zipEntry.getName();
if (zipEntry.isDirectory()){
new File(outFileName).mkdir(); //create the new directory
continue;
}
FileOutputStream outFile = new FileOutputStream(outFileName);
BufferedOutputStream dest = new BufferedOutputStream(outFile, BUFSIZE);
//read data from Zip, but do not read huge entries
while (total + BUFSIZE <= TOOBIG && (count = zis.read(data, 0, BUFSIZE)) != -1) {
dest.write(data, 0, count);
total += count;
}
...
}
} finally{
zis.close();
}
}
...
Example 1
, não há nenhuma validação de zipEntry.getName()
antes da realização de funções de leitura/gravação nos dados dentro dessa entrada. Se o arquivo Zip fosse originalmente colocado no diretório "/tmp/
" de um computador baseado em Unix, uma entrada Zip fosse "../etc/hosts
" e o aplicativo fosse executado com as permissões necessárias, ele substituiria o arquivo hosts
do sistema. Isso, por sua vez, permitiria que o tráfego da máquina fosse para qualquer lugar desejado pelo invasor, por exemplo, de volta para a máquina do invasor.
var unzipper = require('unzipper');
var fs = require('fs');
var untrusted_zip = getZipFromRequest();
fs.createReadStream(zipPath).pipe(unzipper.Extract({ path: 'out' }));
ZZArchive* archive = [ZZArchive archiveWithURL:[NSURL fileURLWithPath: zipPath] error:&error];
for (ZZArchiveEntry* entry in archive.entries) {
NSString *fullPath = [NSString stringWithFormat: @"%@/%@", destPath, [entry fileName]];
[[entry newDataWithError:nil] writeToFile:newFullPath atomically:YES];
}
Example 1
, não há nenhuma validação de entry.fileName
antes da realização de funções de leitura/gravação nos dados dentro dessa entrada. Se o arquivo Zip fosse colocado originalmente no diretório "Documents/hot_patches
" de um aplicativo iOS, uma entrada Zip fosse "../js/page.js
", ele substituiria o arquivo page.js
. Isso, por sua vez, permitiria que um invasor injetasse um código mal-intencionado que pudesse resultar na execução de código.
...
$zip = new ZipArchive();
$zip->open("userdefined.zip", ZipArchive::RDONLY);
$zpm = $zip->getNameIndex(0);
$zip->extractTo($zpm);
...
Example 1
, não há nenhuma validação de f.Name
antes da realização de funções de leitura/gravação nos dados dentro dessa entrada. Se o arquivo Zip estiver no diretório "/tmp/
" de um computador Unix, uma entrada Zip for "../etc/hosts
" e o aplicativo for executado com as permissões necessárias, ele substituirá o arquivo hosts
do sistema. Isso permitirá que o tráfego da máquina fosse para qualquer lugar desejado pelo invasor, por exemplo, de volta para a máquina do invasor.
import zipfile
import tarfile
def unzip(archive_name):
zf = zipfile.ZipFile(archive_name)
zf.extractall(".")
zf.close()
def untar(archive_name):
tf = tarfile.TarFile(archive_name)
tf.extractall(".")
tf.close()
Exemplo 2: O exemplo a seguir extrai arquivos de um arquivo Zip e os grava de maneira insegura no disco.
import better.files._
...
val zipPath: File = getUntrustedZip()
val destinationPath = file"out/dest"
zipPath.unzipTo(destination = destinationPath)
import better.files._
...
val zipPath: File = getUntrustedZip()
val destinationPath = file"out/dest"
zipPath.newZipInputStream.mapEntries( (entry : ZipEntry) => {
entry.extractTo(destinationPath, new FileInputStream(entry.getName))
})
Example 2
, não há nenhuma validação de entry.getName
antes da realização de funções de leitura/gravação nos dados dentro dessa entrada. Se o arquivo Zip fosse originalmente colocado no diretório "/tmp/
" de um computador baseado em Unix, uma entrada Zip fosse "../etc/hosts
" e o aplicativo fosse executado com as permissões necessárias, ele substituiria o arquivo hosts
do sistema. Isso, por sua vez, permitiria que o tráfego da máquina fosse para qualquer lugar desejado pelo invasor, por exemplo, de volta para a máquina do invasor.
let archive = try ZZArchive.init(url: URL(fileURLWithPath: zipPath))
for entry in archive.entries {
let fullPath = URL(fileURLWithPath: destPath + "/" + entry.fileName)
try entry.newData().write(to: fullPath)
}
Example 1
, não há nenhuma validação de entry.fileName
antes da realização de funções de leitura/gravação nos dados dentro dessa entrada. Se o arquivo Zip fosse colocado originalmente no diretório "Documents/hot_patches
" de um aplicativo iOS, uma entrada Zip fosse "../js/page.js
", ele substituiria o arquivo page.js
. Isso, por sua vez, permitiria que um invasor injetasse um código mal-intencionado que pudesse resultar na execução de código.FileIOPermissions
necessárias no aplicativo.
...
String permissionsXml = GetPermissionsFromXmlFile();
FileIOPermission perm = new FileIOPermission(PermissionState.None);
perm.FromXml(permissionsXml);
perm.Demand();
...
...
CrytoKeyAuditRule auditRule = new CryptoKeyAuditRule(IdRef, (CryptoKeyRights) input, AuditFlags.Success);
...
input
, ele poderá especificar o tipo de operação que pode ser registrada. Se o usuário puder manipular isso para CryptoKeyRights.Delete
, ele poderá ler a chave de criptografia sem que seja registrada, o que não permite saber que um invasor roubou suas chaves de criptografia.doExchange()
.
try {
doExchange();
}
catch (RareException e) {
// this can never happen
}
RareException
fosse lançado, o programa continuaria sendo executado como se nada incomum tivesse ocorrido. O programa não registra nenhuma evidência indicando a situação especial, potencialmente frustrando qualquer tentativa posterior de explicar o comportamento do programa.DoExchange()
.
try {
DoExchange();
}
catch (RareException e) {
// this can never happen
}
RareException
tivesse que ser lançada alguma vez, o programa continuaria a ser executado como se nada incomum tivesse ocorrido. O programa não registra nenhuma evidência que indique a situação especial, possivelmente frustrando qualquer tentativa posterior de explicar o comportamento do programa.doExchange()
.
try {
doExchange();
}
catch (RareException e) {
// this can never happen
}
RareException
tivesse que ser lançada alguma vez, o programa continuaria a ser executado como se nada incomum tivesse ocorrido. O programa não registra nenhuma evidência que indique a situação especial, possivelmente frustrando qualquer tentativa posterior de explicar o comportamento do programa.doExchange()
.
try {
doExchange();
}
catch (exception $e) {
// this can never happen
}
RareException
tivesse que ser lançada alguma vez, o programa continuaria a ser executado como se nada incomum tivesse ocorrido. O programa não registra nenhuma evidência que indique a situação especial, possivelmente frustrando qualquer tentativa posterior de explicar o comportamento do programa.open()
.
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except:
# This will never happen
pass
RareException
tivesse que ser lançada alguma vez, o programa continuaria a ser executado como se nada incomum tivesse ocorrido. O programa não registra nenhuma evidência que indique a situação especial, possivelmente frustrando qualquer tentativa posterior de explicar o comportamento do programa.Exception
, pode obscurecer exceções que merecem tratamento especial ou que não devem ser detectadas a essa altura no programa. A captura uma exceção excessivamente ampla destrói em essência a finalidade de exceções .NET com tipo definido, podendo tornar-se um procedimento particularmente perigoso se o programa crescer e começar a lançar novos tipos de exceções. Os novos tipos de exceção não receberão nenhuma atenção.
try {
DoExchange();
}
catch (IOException e) {
logger.Error("DoExchange failed", e);
}
catch (FormatException e) {
logger.Error("DoExchange failed", e);
}
catch (TimeoutException e) {
logger.Error("DoExchange failed", e);
}
try {
DoExchange();
}
catch (Exception e) {
logger.Error("DoExchange failed", e);
}
DoExchange()
for modificado de forma a lançar um novo tipo de exceção que deve ser tratado de maneira diferente, o bloco "catch" amplo impedirá que o compilador aponte a situação. Além disso, o novo bloco "catch" também passará a lidar com exceções dos tipos ApplicationException
e NullReferenceException
, o que não é a intenção do programador.Exception
, pode obscurecer exceções que merecem tratamento especial ou que não devem ser detectadas a essa altura no programa. A captura uma exceção excessivamente ampla destrói em essência a finalidade de exceções de Java com tipo definido, podendo tornar-se um procedimento particularmente perigoso se o programa crescer e começar a lançar novos tipos de exceções. Os novos tipos de exceção não receberão nenhuma atenção.
try {
doExchange();
}
catch (IOException e) {
logger.error("doExchange failed", e);
}
catch (InvocationTargetException e) {
logger.error("doExchange failed", e);
}
catch (SQLException e) {
logger.error("doExchange failed", e);
}
try {
doExchange();
}
catch (Exception e) {
logger.error("doExchange failed", e);
}
doExchange()
for modificado de forma a lançar um novo tipo de exceção que deve ser tratado de maneira diferente, o bloco "catch" amplo impedirá que o compilador aponte a situação. Além disso, o novo bloco "catch" também passará a lidar com exceções derivadas de RuntimeException
, como ClassCastException
e NullPointerException
, o que não é a intenção do programador.NullReferenceException
é uma prática imprópria.NullReferenceException
em três circunstâncias:NullReferenceException
para sinalizar uma condição de erro.NullReferenceException
por engano.
try {
MysteryMethod();
}
catch (NullReferenceException npe) {
}
Console.Out
ou Console.Error
no lugar de um recurso dedicado de registro em log dificulta o monitoramento do comportamento do programa.
public class MyClass {
...
Console.WriteLine("hello world");
...
}
Console.WriteLine()
.Console.WriteLine
pode indicar um descuido na mudança para um sistema de registro em log estruturado.os.Stdout
ou os.Stderr
no lugar de um recurso dedicado de registro em log dificulta o monitoramento do comportamento do programa.
...
func foo(){
fmt.Println("Hello World")
}
fmt.Println()
.os.Stdout
ou os.Stderr
pode indicar um descuido na mudança para um sistema de registro em log estruturado.System.out
ou System.err
no lugar de um recurso dedicado de registro em log dificulta o monitoramento do comportamento do programa.
public class MyClass
...
System.out.println("hello world");
...
}
System.out.println()
.System.out
ou System.err
pode indicar um descuido na mudança para um sistema de registro em log estruturado.process.stdout
ou process.stderr
no lugar de um recurso dedicado de registro em log dificulta o monitoramento do comportamento do programa.
process.stdin.on('readable', function(){
var s = process.stdin.read();
if (s != null){
process.stdout.write(s);
}
});
process.stdout.write()
.process.stdout
ou process.stderr
pode indicar um descuido na mudança para um sistema de registro em log estruturado.print
ou println
no lugar de um recurso dedicado de registro em log dificulta o monitoramento do comportamento do programa.
class MyClass {
...
println("hello world")
...
}
}
print
ou println
.
sys.stdout.write("hello world")
sys.stdout
ou sys.stderr
pode indicar um descuido na mudança para um sistema de registro em log estruturado.Kernel.puts
, Kernel.warn
ou Kernel.printf
em vez de um recurso de registro em log dedicado torna difícil monitorar o comportamento do programa.
...
puts "hello world"
...
Kernel.puts
.Kernel.puts
,Kernel.warn
or Kernel.printf
pode indicar um descuido na alteração para um sistema de registro em log estruturado.Logger
, mas registra informações em um fluxo de saída do sistema:
require 'logger'
...
logger = Logger.new($stdout)
logger.info("hello world")
...
...
var file:File = new File(directoryName + "\\" + fileName);
...
...
FileStream f = File.Create(directoryName + "\\" + fileName);
...
...
File file = new File(directoryName + "\\" + fileName);
...
...
os.open(directoryName + "\\" + fileName);
...
...
uid = 'scott'.
password = 'tiger'.
WRITE: / 'Default username for FTP connection is: ', uid.
WRITE: / 'Default password for FTP connection is: ', password.
...
pass = getPassword();
...
trace(id+":"+pass+":"+type+":"+tstamp);
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
...
ResetPasswordResult passRes = System.resetPassword(id1, true);
System.Debug('New password: '+passRes.getPassword());
...
pass = GetPassword();
...
dbmsLog.WriteLine(id+":"+pass+":"+type+":"+tstamp);
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.get_password()
retorna a senha de texto sem formatação fornecida pelo usuário que está associada à conta.
pass = get_password();
...
fprintf(dbms_log, "%d:%s:%s:%s", id, pass, type, tstamp);
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no sistema de arquivos como um local de armazenamento seguro para todos os tipos de dados, convém não confiar nele implicitamente, particularmente nos casos em que a privacidade é uma grande preocupação.
...
MOVE "scott" TO UID.
MOVE "tiger" TO PASSWORD.
DISPLAY "Default username for database connection is: ", UID.
DISPLAY "Default password for database connection is: ", PASSWORD.
...
Session.pword
contém a senha de texto sem formatação fornecida pelo usuário que está associada à conta.
<cflog file="app_log" application="No" Thread="No"
text="#Session.uname#:#Session.pword#:#type#:#Now()#">
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
var pass = getPassword();
...
dbmsLog.println(id+":"+pass+":"+type+":"+tstamp);
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.GetPassword()
, que retorna a senha em texto sem formatação fornecida pelo usuário e associada à conta.
pass = GetPassword();
...
if err != nil {
log.Printf('%s: %s %s %s', id, pass, type, tsstamp)
}
Example 1
registra uma senha de texto sem formatação no log de eventos do aplicativo. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
pass = getPassword();
...
dbmsLog.println(id+":"+pass+":"+type+":"+tstamp);
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
...
webview.setWebViewClient(new WebViewClient() {
public void onReceivedHttpAuthRequest(WebView view,
HttpAuthHandler handler, String host, String realm) {
String[] credentials = view.getHttpAuthUsernamePassword(host, realm);
String username = credentials[0];
String password = credentials[1];
Intent i = new Intent();
i.setAction("SEND_CREDENTIALS");
i.putExtra("username", username);
i.putExtra("password", password);
view.getContext().sendBroadcast(i);
}
});
...
SEND_CREDENTIALS
receberá a mensagem. A transmissão nem mesmo é protegida com uma permissão para limitar o número de destinatários, embora, neste caso, não recomendemos o uso de permissões como correção.
localStorage.setItem('password', password);
pass = getPassword()
...
dbmsLog.println("$id:$pass:$type:$tstamp")
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
...
webview.webViewClient = object : WebViewClient() {
override fun onReceivedHttpAuthRequest(view: WebView,
handler: HttpAuthHandler, host: String, realm: String
) {
val credentials = view.getHttpAuthUsernamePassword(host, realm)
val username = credentials!![0]
val password = credentials[1]
val i = Intent()
i.action = "SEND_CREDENTIALS"
i.putExtra("username", username)
i.putExtra("password", password)
view.context.sendBroadcast(i)
}
}
...
SEND_CREDENTIALS
receberá a mensagem. A transmissão nem mesmo é protegida com uma permissão para limitar o número de destinatários, embora, neste caso, não recomendemos o uso de permissões como correção.
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = kCLDistanceFilterNone;
[locationManager startUpdatingLocation];
CLLocation *location = [locationManager location];
// Configure the new event with information from the location
CLLocationCoordinate2D coordinate = [location coordinate];
NSString *latitude = [NSString stringWithFormat:@"%f", coordinate.latitude];
NSString *longitude = [NSString stringWithFormat:@"%f", coordinate.longitude];
NSLog(@"dLatitude : %@", latitude);
NSLog(@"dLongitude : %@",longitude);
NSString *urlWithParams = [NSString stringWithFormat:TOKEN_URL, latitude, longitude];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlWithParams]];
[request setHTTPMethod:@"GET"];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// Add password to user defaults
[defaults setObject:@"Super Secret" forKey:@"passwd"];
[defaults synchronize];
getPassword()
que retorna a senha de texto sem formatação fornecida pelo usuário com a conta.
<?php
$pass = getPassword();
trigger_error($id . ":" . $pass . ":" . $type . ":" . $tstamp);
?>
Example 1
registra uma senha de texto sem formatação no log de eventos do aplicativo. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.OWA_SEC.get_password()
retorna a senha de texto simples fornecida pelo usuário associada à conta, que é então impressa à resposta HTTP.
...
HTP.htmlOpen;
HTP.headOpen;
HTP.title (.Account Information.);
HTP.headClose;
HTP.bodyOpen;
HTP.br;
HTP.print('User ID: ' ||
OWA_SEC.get_user_id || '');
HTP.print('User Password: ' ||
OWA_SEC.get_password || '');
HTP.br;
HTP.bodyClose;
HTP.htmlClose;
...
getPassword()
que retorna a senha de texto sem formatação fornecida pelo usuário com a conta.
pass = getPassword();
logger.warning('%s: %s %s %s', id, pass, type, tsstamp)
Example 1
registra uma senha de texto sem formatação no log de eventos do aplicativo. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.get_password()
retorna a senha de texto sem formatação fornecida pelo usuário que está associada à conta.
pass = get_password()
...
dbms_logger.warn("#{id}:#{pass}:#{type}:#{tstamp}")
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
val pass = getPassword()
...
dbmsLog.println(id+":"+pass+":"+type+":"+tstamp)
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
import CoreLocation
...
var locationManager : CLLocationManager!
var seenError : Bool = false
var locationFixAchieved : Bool = false
var locationStatus : NSString = "Not Started"
seenError = false
locationFixAchieved = false
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.locationServicesEnabled
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
...
if let location: CLLocation! = locationManager.location {
var coordinate : CLLocationCoordinate2D = location.coordinate
let latitude = NSString(format:@"%f", coordinate.latitude)
let longitude = NSString(format:@"%f", coordinate.longitude)
NSLog("dLatitude : %@", latitude)
NSLog("dLongitude : %@",longitude)
let urlString : String = "http://myserver.com/?lat=\(latitude)&lon=\(longitude)"
let url : NSURL = NSURL(string:urlString)
let request : NSURLRequest = NSURLRequest(URL:url)
var err : NSError?
var response : NSURLResponse?
var data : NSData = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error:&err)
} else {
println("no location...")
}
let defaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()
// Add password to user defaults
defaults.setObject("Super Secret" forKey:"passwd")
defaults.synchronize()
getPassword
retorna a senha de texto sem formatação fornecida pelo usuário que está associada à conta.
pass = getPassword
...
App.EventLog id & ":" & pass & ":" & type & ":" &tstamp, 4
...
Example 1
registra uma senha de texto sem formatação no log de eventos do aplicativo. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
...
HKHealthStore healthStore = new HKHealthStore();
HKBloodTypeObject blood = healthStore.GetBloodType(null);
NSLog("%@", blood.BloodType);
var urlWithParams = String.format(TOKEN_URL, block.BloodType);
var responseString = await client.GetStringAsync(urlWithParams);
...
NSLog
, permite que um desenvolvedor crie um aplicativo que pode ler todos os logs no dispositivo (mesmo quando eles não são proprietários dos outros aplicativos).
...
HKHealthStore healthStore = new HKHealthStore();
HKBloodTypeObject blood = healthStore.GetBloodType(null);
// Add blood type to user defaults
NSUserDefaults.StandardUserDefaults.SetString(blood.BloodType, "bloodType");
...
...
HKHealthStore *healthStore = [[HKHealthStore alloc] init];
HKBloodTypeObject *blood = [healthStore bloodTypeWithError:nil];
NSLog(@"%@", [blood bloodType]);
NSString *urlWithParams = [NSString stringWithFormat:TOKEN_URL, [blood bloodType]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlWithParams]];
[request setHTTPMethod:@"GET"];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
...
NSLog
, permite que um desenvolvedor crie um aplicativo que pode ler todos os logs no dispositivo (mesmo quando eles não são proprietários dos outros aplicativos).
...
HKHealthStore *healthStore = [[HKHealthStore alloc] init];
HKBloodTypeObject *blood = [healthStore bloodTypeWithError:nil];
// Add blood type to user defaults
[defaults setObject:[blood bloodType] forKey:@"bloodType"];
[defaults synchronize];
...
...
let healthStore = HKHealthStore()
let blood = try healthStore.bloodType()
print(blood.bloodType)
let urlString : String = "http://myserver.com/?data=\(blood.bloodType)"
let url : NSURL = NSURL(string:urlString)
let request : NSURLRequest = NSURLRequest(URL:url)
var err : NSError?
var response : NSURLResponse?
var data : NSData = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error:&err)
...
NSLog
, permite que um desenvolvedor crie um aplicativo que pode ler todos os logs no dispositivo (mesmo quando eles não são proprietários dos outros aplicativos).
...
let healthStore = HKHealthStore()
let blood = try healthStore.bloodType()
print(blood.bloodType)
// Add blood type to user defaults
defaults.setObject("BloodType" forKey:blood.bloodType)
defaults.synchronize()
...
String
inseguro.
public static String getPassword() {
String inputPassword = "";
ConsoleKeyInfo nextKey = Console.ReadKey(true);
while (nextKey.Key != Console.ReadKey(true)) {
inputPassword.AppendChar(nextKey.KeyChar);
Console.Write("*");
nextKey = Console.ReadKey(true);
}
return inputPassword;
}
String
é um objeto imutável, o conteúdo não pode ser anulado, o que significa que os dados confidenciais estão abertos a qualquer pessoa capaz de inspecionar o heap antes de coleta de lixo.String
torna impossível limpar com segurança os dados da memória.String
s são usados para armazenar dados confidenciais, como os objetosString
são imutáveis, apenas o coletor de lixo JVM pode remover o valor de um String
da memória só pode ser feito pelo coletor de lixo da JVM. Não é necessário que o coletor de lixo seja executado, a menos que a JVM esteja com pouca memória, portanto, não há garantia de quando a coleta de lixo ocorrerá. No caso de uma falha do aplicativo, um despejo de memória do aplicativo pode revelar dados confidenciais.String
.
private JPasswordField pf;
...
final char[] password = pf.getPassword();
...
String passwordAsString = new String(password);
String
torna impossível limpar com segurança os dados da memória.String
s são usados para armazenar dados confidenciais, no entanto, como os objetos String
são imutáveis, atribuir um novo valor a eles criará um novo String
e atribuirá sua referência àquele que está sendo atribuído. O valor original será mantido na memória até que o ARC
(Automatic Reference Counting) desaloque o objeto e libere sua memória. O Swift não garante a vida útil de um objeto até o final do escopo circundante mais próximo. Se um invasor eliminar o conteúdo da memória antes que o objeto seja desalocado, o conteúdo poderá ser lido.String
.
let password = passwordTextField.text!
// use the password
DataVisualization
que gera um gráfico de informações financeiras confidenciais a partir da Fonte de Dados XML SensitiveXMLData
:
<asp:Chart ID="Chart1" runat="server" ImageLocation="~/Temporary/Graph"
ImageType="Jpeg" DataSourceID="SensitiveXMLData" ImageStorageMode="UseImageLocation">
<series>
.
.
.
</series>
<chartareas>
<asp:ChartArea Name="ChartArea1">
</asp:ChartArea>
</chartareas>
</asp:Chart>
Example 1
instrui o controle Chart
a produzir uma imagem JPEG do gráfico de barras e gravá-la no diretório temporário ~/Temporary/Graph
. Depois que o controle gravar a imagem no disco, o navegador do usuário realizará uma solicitação posterior do arquivo e o exibirá para o usuário. A imagem não é gravada de forma segura no disco. Além disso, o código pressupõe que a infraestrutura subjacente protegerá o arquivo de acessos não autorizados por outro usuário.DataType
como a senha, o que significa que, por padrão, ela será mostrada quando exibida:
public class User
{
[Required]
public int ID { get; set; }
public string Title { get; set; }
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime DateOfEmployment { get; set; }
[DataType(DataType.Currency)]
public decimal Salary { get; set; }
[Required]
public string Username { get; set; }
[Required]
public string Password { get; set; }
...
}
Password
no Example 1
não especificou o atributo [DataType(DataType.Password)]
, ele não será oculto por padrão quando for exibido na interface do usuário.TextField
não oculta a senha de um usuário conforme ele a digita no prompt de entrada:
class SelectionContainerDisabledExampleApp extends StatelessWidget {
const SelectionContainerDisabledExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: Column(
children: <Widget>[
TextField(
decoration: InputDecoration(
hintText: "Please enter your password",
),
),
],
),
),
),
);
}
}
TextField
no Example 1
foi instanciado com a propriedade obscureText
, definida como true
, a senha do usuário não será obscurecida quando ele a digitar no prompt "Please enter your password: ".PasswordCallback pc = new PasswordCallback("Please enter your password: ", true);
pc
no Exemplo 1
foi instanciado com seu segundo parâmetro onEcho
definido como true
, a senha do usuário não será obscurecida quando ele a digitar no prompt "Please enter your password: ".
ViewController.h:
...
@property (nonatomic, retain) IBOutlet UITextField *passwordField;
...
ViewController.m:
...
NSString *password = _passwordField.text;
...
passwordField
no Exemplo 1
não tem a respectiva propriedade secureTextEntry
definida como true
, a senha não será obscurecida quando o usuário a digitar no campo de texto.
...
@IBOutlet weak var passwordField: UITextField!
...
let password = passwordField.text
...
passwordField
no Exemplo 1
não tem a respectiva propriedade secureTextEntry
definida como true
, a senha não será obscurecida quando o usuário a digitar no campo de texto.
...
tid = request->get_form_field( 'tid' ).
CALL TRANSACTION tid USING bdcdata MODE 'N'
MESSAGES INTO messtab.
...
APPHOME
de configuração do aplicativo e, em seguida, carrega uma biblioteca nativa com base em um caminho relativo a partir do diretório especificado.
...
string lib = ConfigurationManager.AppSettings["APPHOME"];
Environment.ExitCode = AppDomain.CurrentDomain.ExecuteAssembly(lib);
...
APPHOME
de configuração desse aplicativo de forma que ela aponte para um caminho diferente contendo uma versão mal-intencionada de LIBNAME
. Como o programa não valida o valor lido do ambiente, se um invasor puder controlar o valor da propriedade do sistema APPHOME
, ele poderá enganar o aplicativo, fazendo com que este execute o código mal-intencionado, e assumir o controle do sistema.
...
RegQueryValueEx(hkey, "APPHOME",
0, 0, (BYTE*)home, &size);
char* lib=(char*)malloc(strlen(home)+strlen(INITLIB));
if (lib) {
strcpy(lib,home);
strcat(lib,INITCMD);
LoadLibrary(lib);
}
...
INITLIB
. Como o programa não valida o valor lido do ambiente, se um invasor conseguir controlar o valor de APPHOME
, ele poderá enganar o arquivo para que ele execute código mal-intencionado.liberty.dll
, que se destina a ser encontrada em um diretório padrão do sistema.
LoadLibrary("liberty.dll");
liberty.dll
. Se um invasor colocar uma biblioteca mal-intencionada chamada liberty.dll
na ordem de pesquisa em uma posição superior à do arquivo pretendido e tiver uma maneira de executar o programa no respectivo ambiente, e não no ambiente de um servidor Web, o aplicativo carregará essa biblioteca mal-intencionada em vez da biblioteca confiável. Como esse tipo de aplicativo é executado com privilégios elevados, o conteúdo do arquivo liberty.dll
do invasor é agora executado com privilégios elevados, possivelmente dando a ele controle total sobre o sistema.LoadLibrary()
quando um caminho absoluto não é especificado. Se o diretório atual for pesquisado antes dos diretórios do sistema, como era o caso até as versões mais recentes do Windows, esse tipo de ataque se tornará comum caso o invasor consiga executar o programa localmente. A ordem de pesquisa depende da versão do sistema operacional e é controlada em sistemas operacionais mais recentes pelo valor desta chave do registro:
HKLM\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
LoadLibrary()
se comporta da seguinte maneira:SafeDllSearchMode
for 1, a ordem de pesquisa será a seguinte:PATH
.SafeDllSearchMode
for 0, a ordem de pesquisa será a seguinte:PATH
.
...
ACCEPT PROGNAME.
EXEC CICS
LINK PROGRAM(PROGNAME)
COMMAREA(COMA)
LENGTH(LENA)
DATALENGTH(LENI)
SYSID('CONX')
END-EXEC.
...
APPHOME
para determinar o diretório no qual ele está instalado e, em seguida, carrega uma biblioteca nativa com base em um caminho relativo a partir do diretório especificado.
...
String home = System.getProperty("APPHOME");
String lib = home + LIBNAME;
java.lang.Runtime.getRuntime().load(lib);
...
APPHOME
de forma que ela aponte para um caminho diferente contendo uma versão mal-intencionada de LIBNAME
. Como o programa não valida o valor lido do ambiente, se um invasor puder controlar o valor da propriedade do sistema APPHOME
, ele poderá enganar o aplicativo, fazendo com que este execute o código mal-intencionado, e assumir o controle do sistema.System.loadLibrary()
para carregar o código de uma biblioteca nativa denominada library.dll
, que é normalmente encontrada em um diretório de sistema padrão.
...
System.loadLibrary("library.dll");
...
System.loadLibrary()
aceita um nome de biblioteca, mas não um caminho, para a biblioteca a ser carregada. A partir da documentação da API Java 1.4.2, essa função se comporta da seguinte maneira [1]:library.dll
em uma posição na ordem de pesquisa superior à do arquivo que o aplicativo pretende carregar, este carregará a cópia mal-intencionada em vez do arquivo pretendido. Por causa da natureza do aplicativo, ele é executado com privilégios elevados, o que significa que o conteúdo do arquivo library.dll
do invasor será agora executado com privilégios elevados, possivelmente concedendo a ele controle total sobre o sistema.Express
para carregar dinamicamente um arquivo de biblioteca. Em seguida, Node.js
continua a pesquisar o respectivo caminho de carga de biblioteca normal em busca de um arquivo ou uma pasta que contenha essa biblioteca[1].
var express = require('express');
var app = express();
app.get('/', function(req, res, next) {
res.render('tutorial/' + req.params.page);
});
Express
, a página transmitida para Response.render()
carregará uma biblioteca da extensão quando for anteriormente desconhecida. Isso geralmente não apresenta prolemas para entradas, como "foo.pug", pois significará o carregamento da biblioteca pug
, um notório mecanismo de modelo. No entanto, se um invasor puder controlar a página e, portanto, a extensão, ele poderá optar por carregar qualquer biblioteca nos caminhos de carregamento de módulo Node.js
. Como o programa não valida as informações recebidas do parâmetro de URL, o invasor pode enganar o aplicativo, fazendo com que ele execute código mal-intencionado, e assumir o controle do sistema.APPHOME
para determinar o diretório no qual ele está instalado e, em seguida, carrega uma biblioteca nativa com base em um caminho relativo a partir do diretório especificado.
...
$home = getenv("APPHOME");
$lib = $home + $LIBNAME;
dl($lib);
...
APPHOME
de forma que ela aponte para um caminho diferente contendo uma versão mal-intencionada de LIBNAME
. Como o programa não valida o valor lido do ambiente, se um invasor puder controlar o valor da propriedade do sistema APPHOME
, ele poderá enganar o aplicativo, fazendo com que este execute o código mal-intencionado, e assumir o controle do sistema.dl()
para carregar o código de uma biblioteca chamada sockets.dll
, que pode ser carregada de vários locais, dependendo da sua instalação e da sua configuração.
...
dl("sockets");
...
dl()
aceita um nome de biblioteca, mas não um caminho, para a biblioteca a ser carregada.sockets.dll
em uma posição na ordem de pesquisa superior à do arquivo que o aplicativo pretende carregar, este carregará a cópia mal-intencionada em vez do arquivo pretendido. Por causa da natureza do aplicativo, ele é executado com privilégios elevados, o que significa que o conteúdo do arquivo sockets.dll
do invasor será agora executado com privilégios elevados, possivelmente concedendo a ele controle total sobre o sistema.Kernel.system()
para executar um executável chamado program.exe
, que normalmente é encontrado em um diretório de sistema padrão.
...
system("program.exe")
...
Kernel.system()
executa algo por meio de um shell. Se um invasor puder manipular as variáveis de ambiente RUBYSHELL
ou COMSPEC
, ele poderá apontar para um executável malicioso que será chamado com o comando dado a Kernel.system()
. Por causa da natureza do aplicativo, ele é executado com os privilégios necessários para realizar operações do sistema, o que significa que, agora, o program.exe
do invasor será executado com esses privilégios, possivelmente concedendo a ele controle total sobre o sistema.Kernel.system()
. Se um invasor puder modificar a variável $PATH
a fim de que aponte para um binário malicioso chamado program.exe
e executar o aplicativo no ambiente dele, o binário malicioso será carregado ao invés do binário pretendido. Por causa da natureza do aplicativo, ele é executado com os privilégios necessários para realizar operações do sistema, o que significa que, agora, o program.exe
do invasor será executado com esses privilégios, possivelmente concedendo a ele controle total sobre o sistema.RoamingFolder
ou RoamingSettings
da classe Windows.Storage.ApplicationData
.RoamingFolder
e RoamingSettings
obtêm um contêiner no repositório de dados do aplicativo em roaming, que pode então ser usado para compartilhar dados entre mais dois dispositivos. Ao gravar e ler objetos armazenados no repositório de dados do aplicativo móvel, o desenvolvedor aumenta o risco de comprometimento. Isso inclui a confidencialidade, a integridade e a disponibilidade dos dados, aplicativos e sistemas que compartilham esses objetos por meio do repositório de dados em roaming.null
antes que seja verificado se ele é realmente null
. Erros de desreferência após a verificação ocorrem quando um programa faz uma verificação explícita em busca de valores null
, mas prossegue para desreferenciar o ponteiro quando se sabe que ele é null
. Erros desse tipo são frequentemente o resultado de um erro de digitação ou de uma desatenção do programador. Um erro de desreferência após o armazenamento ocorre quando um programa define explicitamente um ponteiro como null
e o desreferencia mais tarde. Esse erro é frequentemente o resultado de um programador inicializar uma variável como null
quando ela é declarada.foo
é null
e depois o desreferencia erroneamente. Se foo
for null
quando for verificado na instrução if
, ocorrerá um cancelamento de referência null
, o que causa uma exceção de ponteiro nulo.Exemplo 2: No código a seguir, o programador supõe que a variável
if (foo is null) {
foo.SetBar(val);
...
}
foo
não seja null
e confirma essa suposição desfazendo a referência ao objeto. No entanto, o programador mais tarde contradiz a suposição, verificando foo
com base em null
. Se a variável foo
puder ser null
quando for verificada na instrução if
, ela também poderá ser null
quando sua referência for desfeita, podendo causar uma exceção de ponteiro nulo. Ou o cancelamento de referência não é seguro, ou a verificação subsequente é desnecessária.Exemplo 3: No código a seguir, o programador define explicitamente a variável
foo.SetBar(val);
...
if (foo is not null) {
...
}
foo
como null
. Mais tarde, o programador desreferencia foo
antes de verificar o objeto em busca de um valor null
.
Foo foo = null;
...
foo.SetBar(val);
...
}
null
antes que seja verificado se ele é realmente null
. Erros de desreferência após a verificação ocorrem quando um programa faz uma verificação explícita em busca de valores null
, mas prossegue para desreferenciar o ponteiro quando se sabe que ele é null
. Erros desse tipo são frequentemente o resultado de um erro de digitação ou de uma desatenção do programador. Um erro de desreferência após o armazenamento ocorre quando um programa define explicitamente um ponteiro como null
e o desreferencia mais tarde. Esse erro é frequentemente o resultado de um programador inicializar uma variável como null
quando ela é declarada.ptr
não seja NULL
. Essa suposição se torna explícita quando o programador desreferencia o ponteiro. Mais tarde, essa suposição é contrariada quando o programador verifica ptr
contra NULL
. Se a variável ptr
puder ser NULL
quando for verificada na instrução if
, ela também poderá ser NULL
quando desreferenciada, podendo causar uma falha de segmentação.Exemplo 2: No código a seguir, o programador confirma que a variável
ptr->field = val;
...
if (ptr != NULL) {
...
}
ptr
é NULL
e depois a desreferencia erroneamente. Se a variável ptr
for NULL
quando for verificada na instrução if
, ocorrerá uma desreferência null
, causando assim uma falha de segmentação.Exemplo 3: No código a seguir, o programador se esquece de que a cadeia de caracteres
if (ptr == null) {
ptr->field = val;
...
}
'\0'
é, na verdade, 0 ou NULL
, desreferenciando assim um ponteiro nulo e provocando uma falha de segmentação.Exemplo 4: No código a seguir, o programador define explicitamente a variável
if (ptr == '\0') {
*ptr = val;
...
}
ptr
como NULL
. Mais tarde, o programador desreferencia ptr
antes de verificar o objeto em busca de um valor null
.
*ptr = NULL;
...
ptr->field = val;
...
}
null
, mas prossegue para cancelar a referência ao objeto quando se sabe que ele é null
. Erros desse tipo são frequentemente o resultado de um erro de digitação ou de uma desatenção do programador.foo
é null
e depois a desreferencia erroneamente. Se a variável foo
for null
quando for verificada na instrução if
, ocorrerá um cancelamento de referência null
, provocando assim uma exceção de ponteiro nulo.
if (foo == null) {
foo.setBar(val);
...
}