Uma API é um contrato entre quem chama e o que se chama. As formas mais comuns de abuso de API ocorrem quando o responsável pela chamada não respeita sua parte do contrato. Por exemplo, se um programa não chama chdir() após chamar chroot(), ele viola o contrato que especifica como alterar o diretório raiz ativo de forma segura. Outro bom exemplo de abuso de biblioteca é esperar que o elemento chamado retorne informações confiáveis de DNS ao responsável pela chamada. Nesse caso, o responsável pela chamada abusa a API do elemento chamado ao fazer certas suposições sobre seu comportamento (isto é, que o valor de retorno pode ser usado para fins de autenticação). A outra parte também pode violar o contrato entre quem chama e o que se chama. Por exemplo, se um programador definir SecureRandom como subclasse e retornar um valor não aleatório, o contrato será violado.
_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.
String password=request.getParameter("password");
...
DefaultUser user = (DefaultUser) ESAPI.authenticator().createUser(username, password, password);
finalize()
só deve ser chamado pela JVM após o objeto ter sido coletado como lixo.finalize()
de um objeto seja chamado de fora do finalizador, fazer isso é normalmente uma má ideia. Por exemplo, chamar finalize()
explicitamente significa que finalize()
será chamado mais de uma vez: a primeira vez será a chamada explícita e a última vez será a chamada que é feita depois que o objeto é coletado como lixo.finalize()
explicitamente:
// time to clean up
widget.finalize();
dangerouslySetInnerHTML
O atributo é definido como HTML do código desnecessariamente.dangerouslySetInnerHTML
no React substitui o uso de innerHTML no DOM do navegador, mas a API foi renomeada para transmitir os possíveis perigos de usá-lo. Em geral, definir o HTML com base no código é arriscado porque é fácil expor inadvertidamente seus usuários a um ataque de script entre sites (XSS).dangerouslySetInnerHTML
:
function MyComponent(data) {
return (
<div
dangerouslySetInnerHTML={{__html: data.innerHTML}}
/>
);
}
AUTHID CURRENT_USER
, os identificadores são primeiro resolvidos de acordo com o esquema atual do usuário. Isso pode causar um comportamento inesperado se o definidor do código não disser explicitamente a qual esquema um identificador pertence.SYS.PERMISSIONS
e não poderá modificar as permissões definidas.
CREATE or REPLACE FUNCTION check_permissions(
p_name IN VARCHAR2, p_action IN VARCHAR2)
RETURN BOOLEAN
AUTHID CURRENT_USER
IS
r_count NUMBER;
perm BOOLEAN := FALSE;
BEGIN
SELECT count(*) INTO r_count FROM PERMISSIONS
WHERE name = p_name AND action = p_action;
IF r_count > 0 THEN
perm := TRUE;
END IF;
RETURN perm;
END check_permissions
check_permissions
definir uma tabela de PERMISSIONS
no esquema dele, o banco de dados resolverá o identificador para consultar a tabela local. O usuário teria acesso de gravação à nova tabela e poderia modificá-la para obter permissões que não teria de outra maneira.org.apache.struts2.interceptor.ApplicationtAware
, org.apache.struts2.interceptor.SessionAware
e org.apache.struts2.interceptor.RequestAware
. Para que qualquer um desses mapas de dados seja injetado em seus códigos de Ações, os desenvolvedores precisam implementar o setter especificado na interface (por exemplo: setSession
para a Interface SessionAware
):
public class VulnerableAction extends ActionSupport implements SessionAware {
protected Map<String, Object> session;
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
SessionAware
, RequestAware
e ApplicationAware
.
http://server/VulnerableAction?session.roles=admin
execute()
dessa Ação.execute()
. O caractere !
(exclamação) ou o prefixo method:
pode ser usado na URL da Ação para invocar qualquer método público nessa Ação quando a “Invocação de método dinâmico" está habilitada. Os desenvolvedores que não estiverem cientes desse recurso poderão inadvertidamente expor a lógica de negócios interna aos invasores.http://server/app/recoverpassword!getPassword.action
org.apache.struts2.interceptor.ApplicationtAware
, org.apache.struts2.interceptor.SessionAware
e org.apache.struts2.interceptor.RequestAware
. Para que qualquer um desses mapas de dados seja injetado em seus códigos de Ações, os desenvolvedores precisam implementar o setter especificado na interface (por exemplo: setSession
para a Interface SessionAware
):
public class VulnerableAction extends ActionSupport implements SessionAware {
protected Map<String, Object> session;
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
SessionAware
, RequestAware
e ApplicationAware
.
http://server/VulnerableAction?session.roles=admin
org.apache.struts2.interceptor.ApplicationtAware
, org.apache.struts2.interceptor.SessionAware
e org.apache.struts2.interceptor.RequestAware
. Para que qualquer um desses mapas de dados seja injetado em seus códigos de Ações, os desenvolvedores precisam implementar o setter especificado na interface (por exemplo: setSession
para a Interface SessionAware
):
public class VulnerableAction extends ActionSupport implements SessionAware {
protected Map<String, Object> session;
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
SessionAware
, RequestAware
e ApplicationAware
.
http://server/VulnerableAction?session.roles=admin