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.
private
e final
e, em seguida, cria erroneamente um método que transforma o Set.
@Immutable
public final class ThreeStooges {
private final Set stooges = new HashSet>();
...
public void addStooge(String name) {
stooges.add(name);
}
...
}
final
.Immutable
do pacote de anotações JCIP. Um campo não final viola a imutabilidade da classe permitindo que o valor seja alterado.public
e não final
.
@Immutable
public class ImmutableInteger {
public int value;
}
public
e final
.
@Immutable
public final class ThreeStooges {
public final Set stooges = new HashSet();
...
}
ctx = new InitialContext();
datasource = (DataSource)ctx.lookup(DB_DATASRC_REF);
conn = datasource.getConnection();
conn = DriverManager.getConnection(CONNECT_STRING);
--auto-tls
como true
. Como resultado, a instância etcd usa certificados autoassinados para conexões TLS com clientes.
...
spec:
containers:
- command:
...
- etcd
...
- --auto-tls=true
...
RegisterModel
ou Details
:
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
try
{
return RedirectToAction("Index", "Home");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", "");
}
}
return View(model);
}
RegisterModel
é definida como:
public class RegisterModel
{
[BindRequired]
[Display(Name = "User name")]
public string UserName { get; set; }
[BindRequired]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
public string ConfirmPassword { get; set; }
public Details Details { get; set; }
public RegisterModel()
{
Details = new Details();
}
}
Details
é definida como:Exemplo 2: Ao usar
public class Details
{
public bool IsAdmin { get; set; }
...
}
TryUpdateModel()
ou UpdateModel()
em aplicativos ASP.NET MVC ou Web API, o associador de modelo tentará vincular automaticamente todos os parâmetros de solicitações HTTP por padrão:Exemplo 3: Em aplicativos ASP.NET Web Form, o associador do modelo tentará vincular automaticamente todos os parâmetros de solicitação HTTP ao usar
public ViewResult Register()
{
var model = new RegisterModel();
TryUpdateModel<RegisterModel>(model);
return View("detail", model);
}
TryUpdateModel()
ouUpdateModel()
com a interface IValueProvider.
Employee emp = new Employee();
TryUpdateModel(emp, new System.Web.ModelBinding.FormValueProvider(ModelBindingExecutionContext));
if (ModelState.IsValid)
{
db.SaveChanges();
}
Employee
é definida como:
public class Employee
{
public Employee()
{
IsAdmin = false;
IsManager = false;
}
public string Name { get; set; }
public string Email { get; set; }
public bool IsManager { get; set; }
public bool IsAdmin { get; set; }
}
Booking
:
<view-state id="enterBookingDetails" model="booking">
<on-render>
<render fragments="body" />
</on-render>
<transition on="proceed" to="reviewBooking">
</transition>
<transition on="cancel" to="cancel" bind="false" />
</view-state>
Booking
é definida como:
public class Booking implements Serializable {
private Long id;
private User user;
private Hotel hotel;
private Date checkinDate;
private Date checkoutDate;
private String creditCard;
private String creditCardName;
private int creditCardExpiryMonth;
private int creditCardExpiryYear;
private boolean smoking;
private int beds;
private Set<Amenity> amenities;
// Public Getters and Setters
...
}
Order
, Customer
e Profile
são classes do Microsoft .NET Entity mantidas como persistentes.
public class Order {
public string ordered { get; set; }
public List<LineItem> LineItems { get; set; }
pubilc virtual Customer Customer { get; set; }
...
}
public class Customer {
public int CustomerId { get; set; }
...
public virtual Profile Profile { get; set; }
...
}
public class Profile {
public int profileId { get; set; }
public string username { get; set; }
public string password { get; set; }
...
}
OrderController
é uma de classe de controlador MVC ASP.NET que lida com a solicitação:
public class OrderController : Controller{
StoreEntities db = new StoreEntities();
...
public String updateOrder(Order order) {
...
db.Orders.Add(order);
db.SaveChanges();
}
}
Order
, Customer
e Profile
são classes do Hibernate mantidas como persistentes.
public class Order {
String ordered;
List lineItems;
Customer cust;
...
}
public class Customer {
String customerId;
...
Profile p;
...
}
public class Profile {
String profileId;
String username;
String password;
...
}
OrderController
é uma de classe de controlador Spring que lida com a solicitação:
@Controller
public class OrderController {
...
@RequestMapping("/updateOrder")
public String updateOrder(Order order) {
...
session.save(order);
}
}
[FromBody]
é usada.[FromBody]
é aplicada a um parâmetro complexo de uma ação, então quaisquer outros atributos de associação, como [Bind]
ou [BindNever]
aplicados ao tipo do parâmetro ou qualquer um de seus campos são ignorados efetivamente, o que significa que a mitigação usando anotações de associação é impossível.[FromBody]
é aplicada a um parâmetro de uma ação, o associador de modelo tenta vincular automaticamente todos os parâmetros especificados no corpo da solicitação usando um Formatador de Entrada. Por padrão, o associador usa o Formatador de Entrada JSON para tentar vincular todos os parâmetros possíveis que vêm do corpo da solicitação:
[HttpPost]
public ActionResult Create([FromBody] Product p)
{
return View(p.Name);
}
[Bind]
ou[BindNever]
, aplicadas ao tipo Product
a seguir são ignorados devido ao uso de Formatadores de Entrada quando a anotação [FromBody]
está presente.
public class Product
{
...
public string Name { get; set; }
public bool IsAdmin { get; set; }
...
}
null
.Item
é null
antes de chamar a função membro Equals()
, causando possivelmente um cancelamento de referência null
string itemName = request.Item(ITEM_NAME);
if (itemName.Equals(IMPORTANT_ITEM)) {
...
}
...
null
."null
.malloc()
.
buf = (char*) malloc(req_size);
strncpy(buf, xfer, req_size);
malloc()
falhou por que req_size
era grande demais ou por que muitas solicitações estavam sendo tratadas ao mesmo tempo? Ou ela foi causada por um vazamento de memória que se acumulou com o passar do tempo? Sem realizar o tratamento do erro, não há como saber.null
.getParameter()
é null
antes de chamar a função membro compareTo()
, causando possivelmente um cancelamento de referência null
.Exemplo 2:. O código a seguir mostra uma propriedade do sistema que é definida como
String itemName = request.getParameter(ITEM_NAME);
if (itemName.compareTo(IMPORTANT_ITEM)) {
...
}
...
null
e, mais tarde, tem sua referência desfeita por um programador, que erroneamente assume que ela sempre será definida.
System.clearProperty("os.name");
...
String os = System.getProperty("os.name");
if (os.equalsIgnoreCase("Windows 95") )
System.out.println("Not supported");
null
."null
.Object.equals()
, Comparable.compareTo()
e Comparator.compare()
retornem um valor especificado se seus parâmetros forem null
. Comportamentos inesperados poderão ocorrer se esse contrato não for seguido.equals()
não compara seu parâmetro com null
.
public boolean equals(Object object)
{
return (toString().equals(object.toString()));
}
clone()
deve chamar super.clone()
para obter o novo objeto.clone()
devem obter o novo objeto chamando super.clone()
. Se uma classe não seguir essa convenção, o método clone()
de uma subclasse retornará um objeto do tipo errado.super.clone()
. Devido à forma como Kibitzer
implementa clone()
, o método clone de FancyKibitzer
retornará um objeto do tipo Kibitzer
em vez de FancyKibitzer
.
public class Kibitzer implements Cloneable {
public Object clone() throws CloneNotSupportedException {
Object returnMe = new Kibitzer();
...
}
}
public class FancyKibitzer extends Kibitzer
implements Cloneable {
public Object clone() throws CloneNotSupportedException {
Object returnMe = super.clone();
...
}
}
Equals()
ou GetHashCode()
.a.Equals(b) == true
, a.GetHashCode() == b.GetHashCode()
.Equals()
, mas não GetHashCode()
.
public class Halfway() {
public override boolean Equals(object obj) {
...
}
}
equals()
ou hashCode()
.a.equals(b) == true
, a.hashCode() == b.hashCode()
.equals()
, mas não hashCode()
.
public class halfway() {
public boolean equals(Object obj) {
...
}
}
saveState()
ou restoreState()
.saveState(javax.faces.context.FacesContext)
quanto restoreState(javax.faces.context.FacesContext, java.lang.Object)
ou implementar nenhum dos dois. Como esses dois métodos têm uma relação fortemente acoplada, não é permitido que os métodos saveState(javax.faces.context.FacesContext)
e restoreState(javax.faces.context.FacesContext, java.lang.Object)
residam em diferentes níveis da hierarquia de herança.saveState()
e não restoreState()
e, por isso, é sempre um erro, não importa o que qualquer classe que a estende possa fazer.
public class KibitzState implements StateHolder {
public Object saveState(FacesContext fc) {
...
}
}
checkCallingOrSelfPermission()
ou checkCallingOrSelfUriPermission()
determina se o programa de chamada tem a permissão necessária para acessar um determinado serviço ou URI. No entanto, essas funções devem ser usadas com cautela, pois podem conceder acesso a aplicativos mal-intencionados, que não possuem as permissões apropriadas, assumindo as permissões do seu aplicativo.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)
...