Assert()
com uma permissão específica, é uma maneira de dizer que o fluxo de controle atual tem a permissão especificada. Isso, por sua vez, leva o .NET Framework a interromper todas as verificações de permissão, desde que satisfaça as permissões necessárias, o que significa que o código que chama o código que faz a chamada para Assert()
pode não ter a permissão necessária. O uso do Assert()
é útil em alguns casos, mas pode levar a vulnerabilidades quando permite que um usuário mal-intencionado controle um recurso sem permissão para isso.
IPAddress hostIPAddress = IPAddress.Parse(RemoteIpAddress);
IPHostEntry hostInfo = Dns.GetHostByAddress(hostIPAddress);
if (hostInfo.HostName.EndsWith("trustme.com")) {
trusted = true;
}
getlogin()
é fácil de falsificar. Não confie no nome que ela retorna.getlogin()
deve retornar uma string contendo o nome do usuário atualmente conectado ao terminal, mas um invasor pode fazer com que getlogin()
retorne o nome de qualquer usuário conectado à máquina. Não confie no nome retornado por getlogin()
ao tomar decisões de segurança.getlogin()
para determinar se um usuário é ou não confiável. Isso é facilmente contestado.
pwd = getpwnam(getlogin());
if (isTrustedGroup(pwd->pw_gid)) {
allow();
} else {
deny();
}
String ip = request.getRemoteAddr();
InetAddress addr = InetAddress.getByName(ip);
if (addr.getCanonicalHostName().endsWith("trustme.com")) {
trusted = true;
}
Boolean.getBoolean()
é muitas vezes confundido com chamadas de métodos Boolean.valueOf()
ou Boolean.parseBoolean()
.Boolean.getBoolean()
é muitas vezes má utilizada, pois presume-se que ela retorne o valor booliano representado pelo argumento de string especificado. No entanto, conforme indicado no Javadoc, o método Boolean.getBoolean(String)
"retornará true se, e somente se, a propriedade do sistema nomeada pelo argumento existir e for igual à string 'true'".Boolean.valueOf(String)
ou Boolean.parseBoolean(String)
.Boolean.getBoolean(String)
não converte uma primitiva de String. Ele apenas converte a propriedade do sistema.
...
String isValid = "true";
if ( Boolean.getBoolean(isValid) ) {
System.out.println("TRUE");
}
else {
System.out.println("FALSE");
}
...
GetChars
nas classes Decoder
& Encoding
, e o método GetBytes
nas classes Encoder
& Encoding
no .NET Framework executam internamente a aritmética de ponteiro nas matrizes char e byte para converter o intervalo de caracteres em um intervalo de bytes e vice-versa.
out.println("x = " + encoder.encodeForJavaScript(input) + ";");
...
unichar ellipsis = 0x2026;
NSString *myString = [NSString stringWithFormat:@"My Test String%C", ellipsis];
NSData *asciiData = [myString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *asciiString = [[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding];
NSLog(@"Original: %@ (length %d)", myString, [myString length]);
NSLog(@"Best-fit-mapped: %@ (length %d)", asciiString, [asciiString length]);
// output:
// Original: My Test String... (length 15)
// Best-fit-mapped: My Test String... (length 17)
...
...
let ellipsis = 0x2026;
let myString = NSString(format:"My Test String %C", ellipsis)
let asciiData = myString.dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion:true)
let asciiString = NSString(data:asciiData!, encoding:NSASCIIStringEncoding)
NSLog("Original: %@ (length %d)", myString, myString.length)
NSLog("Best-fit-mapped: %@ (length %d)", asciiString!, asciiString!.length)
// output:
// Original: My Test String ... (length 16)
// Best-fit-mapped: My Test String ... (length 18)
...
_alloca()
pode lançar uma exceção de estouro de pilha, possivelmente travando o programa._alloca()
aloca memória na pilha. Se uma solicitação de alocação for muito grande para o espaço de pilha disponível, _alloca()
lançará uma exceção. Se essa exceção não for detectada, o programa travará, possivelmente permitindo um ataque de negação de serviço._alloca()
tornou-se preterida a partir do Microsoft Visual Studio 2005(R). Ela foi substituída pela função _alloca_s()
mais segura.MAX_PATH
bytes de comprimento, mas você deve verificar a documentação para cada função individualmente. Se o buffer não for grande o suficiente para armazenar o resultado da manipulação, poderá ocorrer um buffer overflow.
char *createOutputDirectory(char *name) {
char outputDirectoryName[128];
if (getCurrentDirectory(128, outputDirectoryName) == 0) {
return null;
}
if (!PathAppend(outputDirectoryName, "output")) {
return null;
}
if (!PathAppend(outputDirectoryName, name)) {
return null;
}
if (SHCreateDirectoryEx(NULL, outputDirectoryName, NULL)
!= ERROR_SUCCESS) {
return null;
}
return StrDup(outputDirectoryName);
}
output\<name>
" no diretório atual e retorna uma cópia de heap alocado do seu nome. Para a maioria dos valores do diretório atual e do parâmetro "name", essa função funcionará corretamente. No entanto, se o parâmetro name
for particularmente longo, a segunda chamada para PathAppend()
poderá causar um estouro do buffer de outputDirectoryName
, que é menor que MAX_PATH
bytes.umask()
é muitas vezes confundida com o argumento para chmod()
.umask()
começa com a instrução falsa:chmod()
, no qual o argumento fornecido pelo usuário especifica os bits a serem habilitados no arquivo especificado, o comportamento de umask()
é, na verdade, o oposto: umask()
define umask como ~mask & 0777
.umask()
continua e descreve o uso correto de umask()
:open()
para definir as permissões de arquivo iniciais em um arquivo recém-criado. Especificamente, as permissões em umask estão desativadas no argumento de modo para open(2)
(e portanto, por exemplo, o valor padrão comum de umask 022 faz com que novos arquivos sejam criados com permissões 0666 & ~022 = 0644 = rw-r--r-- no caso usual em que o modo é especificado como 0666)."
...
struct stat output;
int ret = stat(aFilePath, &output);
// error handling omitted for this example
struct timespec accessTime = output.st_atime;
...
umask()
é muitas vezes confundida com o argumento para chmod()
.umask()
começa com a instrução falsa:chmod()
, no qual o argumento fornecido pelo usuário especifica os bits a serem habilitados no arquivo especificado, o comportamento de umask()
é, na verdade, o oposto: umask()
define umask como ~mask & 0777
.umask()
continua e descreve o uso correto de umask()
:transactionId
ativa em um arquivo temporário no diretório Documentos de aplicativo usando um método vulnerável:
...
//get the documents directory:
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
//make a file name to write the data to using the documents directory:
let fileName = NSString(format:"%@/tmp_activeTrans.txt", documentsPath)
// write data to the file
let transactionId = "TransactionId=12341234"
transactionId.writeToFile(fileName, atomically:true)
...
posted
. FileUpload
é do tipo System.Web.UI.HtmlControls.HtmlInputFile
.
HttpPostedFile posted = FileUpload.PostedFile;
@Controller
public class MyFormController {
...
@RequestMapping("/test")
public String uploadFile (org.springframework.web.multipart.MultipartFile file) {
...
} ...
}
<?php
$udir = 'upload/'; // Relative path under Web root
$ufile = $udir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $ufile)) {
echo "Valid upload received\n";
} else {
echo "Invalid upload rejected\n";
} ?>
from django.core.files.storage import default_storage
from django.core.files.base import File
...
def handle_upload(request):
files = request.FILES
for f in files.values():
path = default_storage.save('upload/', File(f))
...
<input>
do tipo file
indica que o programa aceita uploads de arquivos.
<input type="file">
myModule.config(function($interpolateProvider){
$interpolateProvider.startSymbol("[[");
$interpolateProvider.endSymbol("]]");
});
root
causaram inúmeras catástrofes de segurança no Unix. É imperativo que você analise programas privilegiados cuidadosamente em busca de todos os tipos de problemas de segurança, mas é igualmente importante que esses programas privilegiados retornem a estado sem privilégios o mais rápido possível, a fim de limitar a quantidade de danos que uma vulnerabilidade despercebida pode ser capaz de causar.root
para outro.root
quando um sinal for acionado ou um subprocesso for executado, o manipulador de sinais ou subprocesso operará com privilégios de root. Um invasor pode ser capaz de aproveitar esses privilégios elevados para causar ainda mais danos.root
causaram inúmeros desastres de segurança de Unix. É imperativo que você revise atentamente os programas com privilégios em relação a todos os tipos de problemas de segurança. É igualmente importante que os programas com privilégios retornem a um estado sem privilégios o mais rápido possível para limitar os danos que uma vulnerabilidade não remediada pode causar.root
a outro.root
quando um sinal for disparado ou quando um subprocesso for executado, o manipulador de sinais ou o subprocesso operará com privilégios de root. Um invasor pode aproveitar esses privilégios elevados para causar ainda mais danos.root
causaram inúmeras catástrofes de segurança no Unix. É imperativo que você analise programas privilegiados cuidadosamente em busca de todos os tipos de problemas de segurança, mas é igualmente importante que esses programas privilegiados retornem a estado sem privilégios o mais rápido possível, a fim de limitar a quantidade de danos que uma vulnerabilidade despercebida pode ser capaz de causar.root
para outro.root
quando um sinal for acionado ou um subprocesso for executado, o manipulador de sinais ou subprocesso operará com privilégios de root. Um invasor pode ser capaz de aproveitar esses privilégios elevados para causar ainda mais danos.root
causaram inúmeras catástrofes de segurança no Unix. É imperativo que você analise programas privilegiados cuidadosamente em busca de todos os tipos de problemas de segurança, mas é igualmente importante que esses programas privilegiados retornem a estado sem privilégios o mais rápido possível, a fim de limitar a quantidade de danos que uma vulnerabilidade despercebida pode ser capaz de causar.root
para outro.root
quando um sinal for acionado ou um subprocesso for executado, o manipulador de sinais ou subprocesso operará com privilégios de root. Um invasor pode ser capaz de aproveitar esses privilégios elevados para causar ainda mais danos....
Device.OpenUri("sms:+12345678910");
...
...
[[CTMessageCenter sharedMessageCenter] sendSMSWithText:@"Hello world!" serviceCenter:nil toAddress:@"+12345678910"];
...
// or
...
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:+12345678910"]];
...
// or
...
MFMessageComposeViewController *messageComposerVC = [[MFMessageComposeViewController alloc] init];
[messageComposerVC setMessageComposeDelegate:self];
[messageComposerVC setBody:@"Hello World!"];
[messageComposerVC setRecipients:[NSArray arrayWithObject:@"+12345678910"]];
[self presentViewController:messageComposerVC animated:YES completion:nil];
...
...
UIApplication.sharedApplication().openURL(NSURL(string: "sms:+12345678910"))
...
...
let messageComposeVC = MFMessageComposeViewController()
messageComposeVC.messageComposeDelegate = self
messageComposeVC.body = "Hello World!"
messageComposeVC.recipients = ["+12345678910"]
presentViewController(messageComposeVC, animated: true, completion: nil)
...
MultiByteToWideChar()
, WideCharToMultiByte()
, UnicodeToBytes()
e BytesToUnicode()
para converter entre cadeias de caracteres multibyte arbitrários (geralmente ANSI) e cadeias de caracteres Unicode (caracteres largos). Os argumentos de tamanho para essas funções são especificados em unidades diferentes (um em bytes e o outro em caracteres), fazendo com seu uso seja propenso a erros. Em uma cadeia de caracteres multibyte, cada caractere ocupa um número de bytes variável e, portanto, o tamanho dessas cadeias de caracteres é mais facilmente especificado como um número total de bytes. Por outro lado, em Unicode, os caracteres sempre têm um tamanho fixo, e os comprimentos de cadeias de caracteres são normalmente determinados pelo número de caracteres que as cadeias contêm. Especificar as unidades erradas por engano em um argumento de tamanho pode causar um buffer overflow.
void getUserInfo(char *username, struct _USER_INFO_2 info){
WCHAR unicodeUser[UNLEN+1];
MultiByteToWideChar(CP_ACP, 0, username, -1,
unicodeUser, sizeof(unicodeUser));
NetUserGetInfo(NULL, unicodeUser, 2, (LPBYTE *)&info);
}
unicodeUser
em bytes em vez de em caracteres. Portanto, a chamada para MultiByteToWideChar()
pode gravar caracteres com um comprimento de até (UNLEN+1)*sizeof(WCHAR
, ouUNLEN+1)*sizeof(WCHAR)*sizeof(WCHAR)
bytes, no array unicodeUser
, que tem apenas (UNLEN+1)*sizeof(WCHAR)
bytes alocados. Se a string username
contiver mais de UNLEN
caracteres, a chamada para MultiByteToWideChar()
causará um estouro no buffer unicodeUser
.sun.misc.Unsafe
. Todas as funcionalidades dessa classe são inerentemente inseguras de usar e só podem ser acessadas por meio de reflexão.sun.misc.Unsafe
é para executar operações inseguras e de baixo nível e não se destina ao uso por desenvolvedores.Unsafe
só pode ser obtida por código confiável e normalmente é obtida por meio de reflexão, pois pode ser usada para corromper o sistema ou alocar manualmente memória heap que, se não for tratada adequadamente, poderá ter efeitos prejudiciais no sistema. É imperativo que toda a funcionalidade em torno de sun.misc.Unsafe
seja cuidadosamente revisada e testada para estar ausente de falhas.Value Stack
do Struts 2. Permitir a avaliação de expressões não validadas em relação à Value Stack
pode dar acesso a um invasor para acessar e modificar variáveis do sistema ou executar código arbitrário.
OgnlContext ctx = new OgnlContext();
String expression = request.getParameter("input");
Object expr = Ognl.parseExpression(expression);
Object value = Ognl.getValue(expr, ctx, root);
System.out.println("Value: " + value);
(#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc.exe"))
%{expr}
) em uma marca do Struts que avalia a expressão OGNL duas vezes. Um invasor no controle do resultado da primeira avaliação pode conseguir controlar a expressão a ser avaliada na segunda avaliação OGNL e injetar expressões OGNL arbitrárias.redirectAction
é conhecido por avaliar os respectivos parâmetros duas vezes. Nesse caso, o resultado da expressão OGNL forçada no parâmetro actionName
pode ser controlada por um invasor, fornecendo um parâmetro de solicitação redirect
.
...
<action name="index" class="com.acme.MyAction">
<result type="redirectAction">
<param name="actionName">${#parameters['redirect']}</param>
<param name="namespace">/foo</param>
</result>
</action>
...
%{#parameters['redirect']}
retornando uma cadeia de caracteres controlável pelo usuário que será avaliada como uma expressão OGNL, permitindo que o invasor avalie expressões OGNL arbitrárias.execute()
. O caractere !
(bang) ou o prefixo method:
podem ser usados no URL de ação para invocar qualquer método público na ação em que "Dynamic Method Invocation" estiver habilitado. Na versão Struts 2 2.3.20
, o mecanismo para invocar o método alternativo que se baseava anteriormente na reflexão foi substituído para usar OGNL, o que permitia que os invasores fornecessem expressões OGNL mal-intencionadas em vez de um nome de método alternativo.debug
:console
irá exibir um console de avaliação OGNL, permitindo que os desenvolvedores avaliem qualquer expressão OGNL arbitrária no servidor.command
permitirá que os desenvolvedores enviem expressões OGNL arbitrárias para serem avaliadas usando o parâmetro de solicitação expression
.xml
despejará os parâmetros, o contexto, a sessão e a pilha de valores como um documento XML.browser
despejará os parâmetros, o contexto, a sessão e a pilha de valores como um documento HTML navegável.dest
quando esse usuário clica no link.
...
DATA: str_dest TYPE c.
str_dest = request->get_form_field( 'dest' ).
response->redirect( str_dest ).
...
Example 1
redirecionará o navegador para "http://www.wilyhacker.com".dest
quando esse usuário clica no link.
...
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var strDest:String = String(params["dest"]);
host.updateLocation(strDest);
...
Example 1
redirecionará o navegador para "http://www.wilyhacker.com".PageReference
que consiste em uma URL do parâmetro de solicitação dest
.
public PageReference pageAction() {
...
PageReference ref = ApexPages.currentPage();
Map<String,String> params = ref.getParameters();
return new PageReference(params.get('dest'));
}
Example 1
redirecionará o navegador para "http://www.wilyhacker.com".dest
quando esse usuário clica no link.
String redirect = Request["dest"];
Response.Redirect(redirect);
Example 1
redirecionará o navegador para "http://www.wilyhacker.com".dest
quando esse usuário clica no link.
...
final server = await HttpServer.bind(host, port);
await for (HttpRequest request in server) {
final response = request.response;
final headers = request.headers;
final strDest = headers.value('strDest');
response.headers.contentType = ContentType.text;
response.redirect(Uri.parse(strDest!));
await response.close();
}
...
Example 1
redirecionará o navegador para "http://www.wilyhacker.com".dest
quando esse usuário clica no link.
...
strDest := r.Form.Get("dest")
http.Redirect(w, r, strDest, http.StatusSeeOther)
...
Example 1
redirecionará o navegador para "http://www.wilyhacker.com".dest
quando esse usuário clica no link.
<end-state id="redirectView" view="externalRedirect:#{requestParameters.dest}" />
Example 1
redirecionará o navegador para "http://www.wilyhacker.com".dest
quando um usuário clica no link.
...
strDest = form.dest.value;
window.open(strDest,"myresults");
...
Example 1
redirecionará o navegador para "http://www.wilyhacker.com".dest
quando um usuário clica no link.
<%
...
$strDest = $_GET["dest"];
header("Location: " . $strDest);
...
%>
Example 1
redirecionará o navegador para "http://www.wilyhacker.com".dest
quando um usuário clica no link.
...
-- Assume QUERY_STRING looks like dest=http://www.wilyhacker.com
dest := SUBSTR(OWA_UTIL.get_cgi_env('QUERY_STRING'), 6);
OWA_UTIL.redirect_url('dest');
...
Example 1
redirecionará o navegador para "http://www.wilyhacker.com".dest
quando um usuário clica no link.
...
strDest = request.field("dest")
redirect(strDest)
...
Example 1
redirecionará o navegador para "http://www.wilyhacker.com".dest
:
...
str_dest = req.params['dest']
...
res = Rack::Response.new
...
res.redirect("http://#{dest}")
...
Example 1
redirecionará o navegador para "http://www.wilyhacker.com".dest
.
def myAction = Action { implicit request =>
...
request.getQueryString("dest") match {
case Some(location) => Redirect(location)
case None => Ok("No url found!")
}
...
}
Example 1
redirecionará o navegador para "http://www.wilyhacker.com".requestToLoad
a fim de que aponte para o parâmetro "dest" da URL original, se existente, e para a URL original por meio do esquema http://
de outra maneira, e finalmente carrega essa solicitação dentro de um WKWebView:
...
let requestToLoad : String
...
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
...
if let urlComponents = NSURLComponents(URL: url, resolvingAgainstBaseURL: false) {
if let queryItems = urlComponents.queryItems as? [NSURLQueryItem]{
for queryItem in queryItems {
if queryItem.name == "dest" {
if let value = queryItem.value {
request = NSURLRequest(URL:NSURL(string:value))
requestToLoad = request
break
}
}
}
}
if requestToLoad == nil {
urlComponents.scheme = "http"
requestToLoad = NSURLRequest(URL:urlComponents.URL)
}
}
...
}
...
...
let webView : WKWebView
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
webView.loadRequest(appDelegate.requestToLoad)
...
Example 1
tentará solicitar e carregar "http://www.wilyhacker.com" no WKWebView.dest
quando um usuário clica no link.
...
strDest = Request.Form('dest')
HyperLink.NavigateTo strDest
...
Example 1
redirecionará o navegador para "http://www.wilyhacker.com".security
do OpenAPI e as definições servers
de destino para uma operação da API sempre substituirá as respectivas configurações globais. security
do OpenAPI e as definições servers
de destino para uma operação da API sempre substituirá as respectivas configurações globais.