Abstract:
A secure multilevel object oriented database management system which maintains data confidentiality and optimizes data integrity. All requests for database operations are mediated through an access validation monitor (AVM). The AVM is responsible for performing the following duties: applying mandatory and discretionary access control rules for each request it services to ensure the request is allowable; constructing views of multilevel objects ensuring that the clearance level of the subject making the request dominates the classification of the data being requested; managing data update requests so as to allow polyinstantiation only upon receiving explicit requests from the subject, the explicit request being accomplished through an update to the associated semantic vector (Semantic vectors are employed to maintain data integrity); detecting erroneous polyinstantiation attempts and flagging such errors to the requesting subject; and managing the creation of new multilevel objects, and enforces entity integrity constraints. The AVM constructs the requesting subject&#39;s view of a multilevel object at a particular security level by computing a value for each property of the object. Each property value of the object if determined by inspecting the object&#39;s semantic vector. The semantic vector indicates, for each property of a multilevel object and at every populated level of said object, whether the property&#39;s value is dynamic (i.e., derived from an instantiation stored at the nearest populated dominated sensitivity level of the object where the semantic vector mark such property static).

Description:
STATEMENT REGARDING FEDERALLY SPONSORED RESEARCH OR DEVELOPMENT 
     This invention was made with government support. The U.S. Government has certain rights to this invention. 
    
    
     CROSS-REFERENCE TO RELATED APPLICATIONS 
     A claim of priority is made to U.S. provisional patent application Ser. No. 60/015,322 now pending entitled TOP SECURE ODBM, filed Apr. 12, 1996. 
     BACKGROUND OF THE INVENTION 
     The need for protection of electronically stored data has been recognized since the advent of computer databases. At present there is a need to electronically store and manipulate vast amounts of data, and it is inevitable that some sensitive data will be stored electronically. At the same time, many of databases containing sensitive data are likely to be accessible through a computer network or internetwork, thereby exposing those databases to entities which may attempt to compromise the confidentiality of the sensitive data. 
     Various techniques are known for providing security for sensitive data. For example, password protection and access lists of users having permission to access a particular piece of data may be employed to prevent unauthorized retrieval of the sensitive data. However, even the denial of access to particular data provides information to those entities attempting to compromise the confidentiality of the sensitive data. A &#34;cover story&#34; of false data is therefore provided rather than denying access. This and other complications related to secure databases have lead to the so called *-property (star property) standard which includes specifications for database security. 
     A number of secure databases, both *-property compliant and non-compliant, have been developed. Most early attempts to provide secure databases employed relational database technology, but more recently object oriented databases have been favored because of their inherent advantages including encapsulation and inheritance. However, some of the problems associated with relational databases remain. For example, polyinstantiation resulting from entering and updating data still compromises the integrity of known secure databases. While methods are known for lessening the effects of polyinstantiation, these methods tend to reduce the level of confidentiality of the sensitive data, i.e., the databases become less secure. As a result, known secure databases often represent a compromise between data integrity and data confidentiality. It would therefore be desirable to have a secure database with both data integrity and data confidentiality. 
     BRIEF SUMMARY OF THE INVENTION 
     The multilevel object oriented database management system of the present invention provides both data integrity and data confidentiality. More particularly, an access validation monitor, semantic vectors, multilevel objects and deletion techniques are employed to manage object creation, update, access and deletion in a manner which optimizes data integrity and maintains confidentiality. 
     The access validation monitor (AVM) is employed to prevent accidental polyinstantiation, to enforce mandatory and discretionary access to control, to construct views of objects that are suitable for the clearance of the requesting application (subject) and to process object update, deletion, and creation requests in compliance with data integrity and confidentiality requirements. 
     A multilevel object is associated with at most one instantiation and one semantic vector per each security level, and an access control list which maintains discretionary access control (DAC) information for the object. A multilevel object is said to be populated at a level L if and only if it is associated with an instantiation and a semantic vector at said level. A multilevel object is said to be populated at a level L if and only if it is populated at said level or at one or more lower levels. An instantiation of a multilevel object at level L indicates for each property of said object whether that property&#39;s value at that level is stored in the instantiation (static) or is stored in a lower level instantiation (scooped). By definition, all properties in the lowest populated level of an object are considered static. 
     When a multilevel object is fetched on behalf of a subject executing at a level L and said object is visible to said subject at said clearance level, the AVM constructs a view of said object using the instantiations and semantic vectors at level L and those levels below it; for each property at the nearest populated level (L or below), the semantic vector at said level is examined and the value of said property is computed as follows: if said semantic vector indicates that said property is static, the value of the property is read from the instantiation that is associated with said semantic vector at the location where said property is scooped, and its value is determined by examining lower instantiations and semantic vectors of said object. The view at level L of said object is constructed by storing all computed property values in their assigned locations in a memory block of suitable size to construct an image of said multilevel object as it should be observed by said subject. Said image is returned to said subject as the result of the request. 
     When a multilevel object is created on behalf of subject executing at level L, the AVM generates an object identifier (OID) and creates a multilevel object at that OID and associates a semantic vector with said multilevel object at said level. The generation of said OID depends on the entity integrity (EI) constraints associated with the type of said new object; if said type has EI constraints, the subject must provide an entity identifier (EID) in the object creation request; if said EID is found to match an existing object is returned to the requesting subject, if said existing object is visible at level L tot he requesting subject, an error condition is signaled and the creation fails. If EI constraints are placed on the type of said object, and the EID is not associated with any already existing object, a new OID is generated and a permanent association of said OID with said EID is created and stored in the database, and said OID is returned to the requesting subject. If there are no EI constraints on the type of said new object, a new OID is generated and returned to the requesting subject. In the constraints, the multilevel object at that OID becomes a populated at the level of said subject. In all cases, the requesting subject cannot distinguish whether the returned OID is new or that an existing multilevel object (Only if OID obfuscation is employed. Without obfuscation, it is possible to observe the ordinal sequences of generated OIDs and conclude whether one is being reused or is newly generated). 
     When a subject executing at level L updates its view of a multilevel object and commits the update, the AVM checks that those properties marked scooped at the level of said subject have not changed from their original value. If said multilevel object is not populated at said subject&#39;s level of execution, or if a property at said level is marked scooped in the semantic vector of said multilevel object at said level and has been changed to a new value, than an error condition is signaled, and the update fails. The error condition is called &#34;Accidental Polyinstantiation&#34;. To insure that an update to a multilevel object will proceed successfully, a subject executing at level L must: verify that said multilevel object is populated at said level; an AVM command to populate a specified multilevel object at a specified level is available; then verify that all properties which are modified are marked static in said multilevel object at level L; AVM commands to query and modify the state of the semantic vector of a specified multilevel object at a specific property are available. 
     The semantic vectors thereby obviate the need for redundant storage of object state at each level, and insure that the most recent view of an object is available. Further, since the view construction method at level L does not use information from levels higher than L, confidentiality is preserved. 
     All operations described above are also subject to discretionary access control (DAC). 
    
    
     BRIEF DESCRIPTION OF THE SEVERAL VIEWS OF THE DRAWING 
     Other features and advantages of the present invention will become apparent in light of the following detailed description of the drawing in which: 
     FIG. 1 is a block diagram of a secure data base management system; 
     FIG. 2, FIG. 3 and FIG. 4 are diagrams which illustrate multilevel data management; 
     FIG. 5A, FIG. 5B, FIG. 5C, FIG. 6 and FIG. 7 are multilevel database diagrams which illustrate scooping and semantic vectors; and 
     FIG. 8, FIG. 9 and FIG. 10 illustrate multilevel aggregates and invisible supertypes. 
    
    
     DETAILED DESCRIPTION OF THE INVENTION 
     Referring now to FIG. 1, the database management system has a plurality of modules through which a user 6 communicates with a database 8. Included in the system are a client application module 10, a security administration module 12, a database administration module 14, an audit log management module 16, a schema loader module 18, a schema generation module 20, and access validation monitor (&#34;AVM&#34;) 22, a binder 24, a server 26 and an operating system trusted computing base (&#34;OS-TCB&#34;) 28. 
     The database management system functions to maintain data integrity and data confidentiality while facilitating storage and retrieval of objects on behalf of client applications. Database operations fall into two classes: administration and client service. Administration operations are trusted operations which are performed with trusted agents only, using administration tools to create and configure databases and load schema. Client service operations involve communication between untrusted clients and trusted servers across the TCB interface. Each client application is associated with a security clearance level which may be based upon the identification of the user, the clearance level of the application program, the clearance level of the execution environment, e.g., workstation, network, client site, etc., and the security rules in effect. Storage and retrieval of objects is controlled by rules based upon the clearance levels to maintain a secure database management system. 
     Each client application 10 communicates with the database 8 through the AVM 22, the TCB 28 interface and two types of TCB services: the binder 24 and the server 26. The binder locates servers for the client and manages sessions between servers and clients. The server manages database object storage and retrieval, and transactions including locking and serialization. The binder and server communicate with client applications through the AVM. The AVM 22 is a trusted interface component which manages security over client/server sessions and insures that requests submitted to servers and data transmitted to clients do not violate security constraints. The AVM communicates with other TCB modules and updates the audit log 30, which provides a record of security relevant events. An audit log reader is an untrusted component of high integrity which is employed to monitor the audit log. The AVM provides the exclusive means of access to the content of the object database by untrusted client applications and security administration and database administration modules. Each untrusted client application communicates with the AVM module via a trusted inter-process communication channel provided by the underlying operating system TCB. This channel provides a means for identifying the security profile of the client application. Ideally, the channel also tags each communication from the client application with an unspoofable identifier. This allows the AVM to cache the client application&#39;s security profile and associate it with its identifier for use in future operations. 
     The AVM contains logic for functioning with multilevel objects and addressing each sensitivity level of an object separately. Addressing individual sensitivity levels of an object is facilitated by the database representation of a multilevel object as a collection of other single level objects which make up its different sensitivity levels. Each instantiation and the multilevel object can be addressed separately by the server 26, while database client applications 10 refer to their sensitivity level view (1-view) of the object. The AVM 22 replicates the interface of the server 26 and the binder 24, filters all client application requests to these services, and pre/post-processes these requests and their responses. Thus, the AVM provides multilevel processing on top of previously available database facilities. 
     Referring now to FIGS. 2, 3 and 4, multilevel objects 32 are stored according to security level 34. More particularly, each object may include a plurality of 1-views existing at different security levels. Exemplary security levels 34 include &#34;unclassified -- U,&#34; &#34;classified -- C,&#34; &#34;secret -- S&#34; and &#34;top secret -- TS.&#34; In order to access a particular 1-view while traversing an object, the client application must have a security profile clearance level equal to or higher than that of the 1-view. Further, in accordance with the *-property, an 1-view created or updated by a particular client application must have a security level which is at least as high as that of the client application creating or updating the data. Also, writing data &#34;down&#34; to lower security levels and reading data &#34;up&#34; from higher security levels is prohibited. 
     As shown in FIG. 4, multilevel objects may be stored according to both compartment 36 and security level 34. Exemplary compartments include &#34;Army,&#34; &#34;Navy&#34; and &#34;Air Force.&#34; In this configuration the object may have different 1-views in different compartments at a given security level. In order to access a particular l-view while traversing an object, the client application must have a security profile clearance level equal to or higher than that of the 1-view in addition to permission from the compartment in which the view resides. 
     Multilevel objects are represented as instances of a C++class OC --  MultiLevelObj, which implements two vectors of N references each, where N is the maximum number of supported security levels. A first vector contains references to the 1-instantiations of the object and a second vector contains references to the corresponding semantic vectors. Object types are indicated via a contained reference to an OC --  Type object stored in the database. The contained reference is an object identifier (&#34;OID&#34;) value, and multilevel objects are all one type. 1-instantiations have various system-defined and application-defined types, but the various 1-instantiations of a multi-level object will have the same type. In the context of a schema that contains cover stories, the 1-instantiations may logically reference different 1-views of the same multi-level type object. Typically, however, the 1-instantiations simply reference a single-level type object. 
     Each 1-instantiation is only referenced by the multilevel object associated therewith, and all other references are made through the OID of the multilevel object. Following such a reference in the context of a client at a given level will result in production by the AVM of a correctly-typed 1-view object derived from the state of the dominated 1-instantiations of the multi-level object. For security reasons the existence and structure of the multilevel object is normally restricted to the AVM and Trusted Path operations. Multilevel objects thus add an extra layer of indirection between an object&#39;s identity, as used by references to the object, and the object&#39;s state, as it is represented, labeled and stored. 
     Referring now to FIGS. 5A, 5B, 5C, semantic vectors 38 are utilized to control object traversal. More particularly, the semantic vectors 38 direct the construction of appropriate 1-views 40 of the traversed objects (here A, B, C) while obviating the need for redundant data storage at each sensitivity level. For example, when an exemplary client application executing at Top Secret is directed to traverse the linked sequence of objects starting at the object A, said application would traverse the sequence 
     A: (x=XYZ, next=B), B: (x=NYC, next=C), C: (x=35, next=NULL The value &#34;XYZ&#34; is observed at Top Secret and is stored at Unclassified only. In object B, the value NYC is observed at Top Secret, and is stored at Top Secret, and the semantic vector for said attribute at said level marks it static; thus, although at level Secret object B is tombstoned 50 and appears deleted (a cover story), it can be observed at Top secret. Also, at level Confidential, attribute x of object B appears as &#34;CA&#34;; since level Confidential of the object is unpopulated 52 (i.e.: there is no instantiation at level Confidential in object B, and there is no semantic vector at said level in said object) the view at said level is, by definition, the view at Unclassified, Note that level Confidential of object B consumes no storage although there exists a Confidential 1-view of object B. 
     From object B, sad exemplary application, executing at Top Secret, would issue a request to fetch object C, by activating the reference obtained from the attribute next of object B. Object C appears to hold the value &#34;35&#34; in the attribute x when observed at Top Secret; said value is placed in the view in the AVM during the construction of the Top Secret view of the object C; the Top Secret view is identical to the Secret View, since the Top Secret level is not populated in object C whereas the Secret level is and is the nearest (to Top Secret) populated dominated level of object C. The reference in attribute next in the Top Secret view of C is to Null. the semantic vector at level Secret in object C marks sid attribute as scooped, thereby directing the AVM to looking in the nearest dominated populated level of object C in which said attribute is marked static for a value of said attribute. 
     Thus, scooping obviates the need for storing every view at every visible level, thereby avoiding unnecessary redundant data storage. Semantic vectors summarize object layout and pointer locations and specify the method by which each attribute value of an object is calculated: a property value is either scooped (stored in a dominate instantiation of same object), or static (stores in the instantiation associated with the semantic vector). 
     Referring now to FIGS. 5-7, the representation of semantic vectors 38 can advantageously be manipulated without requiring full object activation. Each semantic vector is a vector of semantic vector cells 42, including one cell for each property 44 of the type which the vector represents. Each semantic vector cell includes the following information: offset of property, size of property, a boolean indicating whether the property is a reference, reference type (in case property is a reference), and boolean information indicating whether a property value is derived by dynamic-read-down. Two reference types are provided: strings and persistent objects (objects with identity). The 1-views are constructed from one or more 1-instantiations of a multilevel object using the semantic vector information. Semantic vectors are identical for all instances of any given type, except for booleans which indicate use of dynamic-read-down. To minimize impact to the server processes, the AVM passes these &#34;components&#34; to and from the server in an OC --  TransObj form. 
     The AVM routine for deriving 1-views from multi-level objects and their components is as follows: 
     
         ______________________________________Input: OID, levelOutput: Instance of OC.sub.-- TransObj representing the 1-view at the requested level.// test for attempts to gain unauthorized accessassert(level is dominated by subject level)obj := getObjFromServer(OID)// single level objects can be directly stored andretrievedif (not (type (obj) ==OC.sub.-- MultiLevleObject))return obj//Find highest and lowest instantiations dominated byrequested level.For each L:= level down to database.sub.-- lowif(obj,instantiation L! is not null) thenif(HighestNotYetFound) then Highest:= L;endifLowest = Lendifendloopassert (HighestHasBeenFound)create unresolved.sub.-- prop.sub.-- list (empty)if (Highest |= Lowest)sv:=getObjFromServer(obj.semantic.sub.-- vector (Highest))For each property P ofobj,instantiation Highest!if(sv.cell P!.is.sub.-- dynamic) then   add P to unresolved.sub.-- prop.sub.-- listendifendloopendif//If all properties are static (or highest==lowest),we&#39;re doneif(unresolved.sub.-- prop.sub.-- list is empty)result:=getObjFromServer (obj.instantiation Highest!)elseresult:=make AndCacheAnLViewAsACopyOf(getObjFromServer(obj.instantiation Highest!))//Now, we try to resolve each property individually//We test down to Lowest+1. At the lowest level, thesemantic vector is//assumed to be static.For L:= Highest-1 down to Lowest+1inst := getObj (obj.instantiation  L!)inst.sub.-- sv:=getObj (obj.semantic.sub.-- vector L!)For each element P of unresolved.sub.-- prop.sub.-- list   if(not inst.sub.-- sv.cell P!.is.sub.-- dynamic)then     result.property.sub.-- value P!:=     inst.property.sub.-- value P!     remove P fromunresolved.sub.-- prop.sub.-- list   endifendloopendloopif(unresolved.sub.-- prop.sub.-- list is not empty) theninst:= getObj (obj.instantiation Lowest!)For each element P of unresolved.sub.-- prop.sub.-- list   result.property.sub.-- value P!:=   inst.property.sub.-- value P!   remove P from unresolved.sub.-- prop.sub.-- listendloopendifendifresult.selRef:=OID//make instantiation look like itis the object at the request OID.assert(unresolved.sub.-- prop.sub.-- lsit is empty)return result______________________________________ 
    
     Referring again to FIG. 1, the AVM 22 prevents polyinstantiation by matching existing object 1-views with newly created views of the same object. An update event occurs when the client application 10 issues a flushObj command to the AVM. The updated state of the object is then passed as an OC --  TransObj. The original state, produced by view construction, is cached in the AVM and is thus available for comparison with the newly submitted state. An update routine compares the newly submitted state to the original state at properties that are marked for dynamic-read-down in the current semantic vector, and insures that only static properties are updated. In accordance with the *-property, updates are allowed only at the subject&#39;s security level, and therefore require no security level input. 
     The update routine operates as follows: 
     
         ______________________________________Input: obj (newly submitted state)Output: nonesubj.sub.-- level:=getSubjectLevel();subj.sub.-- user:=getSubject () ; //get current subject&#39;suser.OID:= obj.selfRefmlobj:=lookup (OID)//validate request: check for attempts to writeat system-low from above.if(mlobj is not multilevel and subj.sub.-- level &gt;0)then   raise error condition // single level   objects are read-only for high subjectsendif// validate request: check for DACtif(not(has.sub.-- access(update.sub.-- obj, mlobj, subj.sub.-- user)))thenraise error condition // permission violation.endif//validate requestif(mlobj is not instantiated at subj.sub.-- level) thenraise error condition // cannot update at anunpopulated levelendif// Check special cases// 1. level 0 can update single level objects.if(mlobj is not multilevel) thencommit objreturnendif//2. lowest populated level is always static// so, we simply update the instantiation.if(lowest populated level(mlobj)== subj.sub.-- level) thenobj.selfRef:= mlobj.instantiation subj.sub.-- level! //restore the OID of the instantiationcommit objreturnendif// General casesv:=lookup.sub.-- sv(OID)// cached from view constructionphase.old.sub.-- obj:= get.sub.-- cached.sub.-- view(OID) // original state.For each property P defined on objif(sv.cell p!.is.sub.-- dynamic) then   if (not (old.sub.-- obj.property.sub.-- value  P!==   obj.property.sub.-- value  P!))     raise error condition // attempt to     update lower-level value   endifendif// At this point, we know that no errors weredetected, and that the multilevel object is populated atthe subject level.obj.selfRef:= mlobj.instantiation subj.sub.-- level! //restore OID of instantiationcommit objreturn______________________________________ 
    
     If the multilevel object was not populated at the subject level during view construction, the client must first issue an add --  instantiation request and semantic vector update requests for those properties that are to be modified in the update request. 
     Object creation requires create --  obj permissions. Newly created objects are given a default Access Control List (&#34;ACL&#34;). Typically, the default ACL grants the creator of the objects all rights to the objects, and grants control rights over the object to a System Security Officer (&#34;SSO&#34;) 46 and a Database Administrator (&#34;DBA&#34;) 48. Object creation requires two requests: (1) new object identifier, and (2) create a new multilevel object of a client specified type at the new identifier. In response the AVM creates an OC --  MultiLevelObj with a semantic vector at the subject level. The newly created object will be instantiated at only one level, the subject level, which will result in its treatment in one of the special cases of update processing. 
     Referring to FIGS. 2 and 3, under Entity Integrity constraints which are imposed on selected types, generated OIDs may refer to objects which are not visible at the calling subject&#39;s level. Without obfuscation it would be possible to infer the existence of such objects by monitoring the changes in OID sequences (segment number). OID obfuscation, which minimizes the information content of observed OID values and renders them time-sensitive, addresses this problem. Obfuscated OIDs lose meaning outside the transaction in which they are observed. 
     To avoid negative interactions between type correctness and security concerns, type tags are attached to entity identifiers. That is, given an object of type T and an entity identifier E, the effective entity identifier of the object is &lt;T,E&gt;. The association between an effective entity identifier and an OID becomes persistent when the object is flushed from the subject and committed. 
     Referring to FIGS. 5A, 5B and 5C, the AVM also controls 1-view deletion. Since object deletion updates the state of the database, observation of object deletion is not allowed below the level at which the deleting subject is executing. Furthermore, if there are instantiations above the deletion level, then the deletion is potentially a cover story. Therefore, the effect is not automatically cascaded upwards either. Importantly, object deletion is indistinguishable from a complete object deletion for an untrusted user. 
     The level at which an object is deleted is marked by a token deletion referred to as &#34;tombstone&#34; 50. During object deletion, if there are no other instantiations for the object, the complete object is deleted. However, if other instantiations exist below the deletion level, those instantiations continue to remain visible at their respective levels. Further, if other instantiations exist above the deletion level, those instantiations also continue to be visible at their respective levels, and any values scooped from the deleted instantiation are written upwards to maintain the coherence of such views. Uninstantiated levels of the object thus appear deleted if their views are constructed from a tombstone 50. 
     During maintenance and cover story/polyinstantiation reconciliation it is possible to &#34;revive&#34;, an object by removing the tombstone 50 and entering an 1-instantiation in place of the removed tombstone. Because there is a need to maintain the appearance of complete object deletion, references that appeared obsolete (pointing to a deleted object) continue to appear obsolete. Otherwise, untrusted subjects might infer the existence of such higher instantiations. To insure this result, both references and the complete object at each level are annotated with incarnation numbers which are invisible to the untrusted client. 
     An exemplary multilevel aggregate system is illustrated in FIG. 8. An 1-view is a full-bodied aggregate object which is constructed using an 1-instantiation. An 1-instantiation is an object which, when coupled with lower level instantiations (or views) and its semantic vector provides sufficient information for constructing an 1-view. The 1-view of a T-typed object is an instance of class T, whereas an 1-instantiation of such an object is not constrained in this manner. The following is therefore employed: (1) at level 1&#39; where dom(1&#39;, 1), the aggregate is always identical to the one at level 1 (traditional scooping); (2) at level 1&#39;, where dom(1&#39;, 1), the aggregate membership information is a modification of the level 1 information; and (3) at level 1&#39;, where dom(1&#39;, 1), the aggregate is independent of lower levels (traditional static). 
     Referring now to FIGS. 8, 9 and 10 the management system also provides models for handling aggregates. Aggregates are object groupings that provide a convenient means of storing and manipulating either ordered or unordered groups of objects. For example, Lists are ordered unkeyed Aggregates that represent linked lists, sequences, queues, or stacks. Lists store members serially, and each member in a list has a position in the List. Insertion into the List at a particular position increments the position of all members following that position. Removal of a member does the opposite. A Set is an unbounded, unordered Aggregate. Set members can be inserted, removed, and tested for membership. Unlike other Aggregates, Sets do not support multiple entries for the same member. All members of a set are unique. An Array is an Association Aggregate whose keys must be the continuous range of integers between specified lower and upper bounds, either of which may be positive, negative, or zero. All of the elements of the Array are allocated and initialized to NULL. The cardinality of the Array is the number of distinct values in the range from the lower bound to the upper bound. A Dictionary is also an Association Aggregate. Keys or tags for a dictionary can be userdefined, rather than being a continuous range of integers, can be user-defined. A Dictionary instance&#39;s tag can associate one object to one or more other objects supporting associative lookup. Dictionaries are unrestricted in size and may be ordered or unordered. 
     An important aspect of security is visibility of &#34;membership&#34; information. More particularly, although an object X and an aggregate A may both be visible at some level 1, the fact that X is (or is not) contained in A may be classified at a higher level. By way of further example, the record on &#34;James Bond&#34; may be visible at level U, and at level U we can see a set of &#34;MI-6 employees&#34;. However, the fact that Bond works for MI-6, i.e., is a member of the employee set, should be visible only at level S or above. Further, if &#34;SPECTRE&#34; membership is tracked in another set, and Bond infiltrates SPECTRE, it may be preferable that the Bond record appear in that set at level U, but be absent at level S or above. The fact that Bond is infiltrating SPECTRE may be classified T so that the Bond record appears in both sets (annotated to avoid the appearance of treason, of course). Such invisible supertypes help to preserve data confidentiality. 
     In the database management system aggregates are treated as atomic objects when a list or array is employed. Under this model, an 1-instantiation is a full-bodied aggregate. That is, if the semantic vector at 1 indicates that the aggregate is static, then the 1-view for that 1-instantiation requires no information from lower levels of visibility to provide membership information. A scooped 1-view is computed from the &#34;highest&#34; dominated m-instantiation when m exists. As with other atomic types, e.g., integer, the value of the object is fully stored at one cell, not collected from different cells at possibly different levels of visibility. Instantiation at a level implies a complete separation from the lower level. This implementation provides view consistency. Assuming updates do not violate the invariance of the applications using the aggregate, then any 1-view whether scooped or static is constructed from a complete and correct aggregate object. The implementation also provides simplicity and efficiency because implementation is uncomplicated. Further, view construction is also simple and efficient since there are no transformations from an instantiation representation to an aggregate object. 
     The 1-instantiation for a set is represented as a 3-tuple &lt;initial, insert, remove&gt;. &#34;Initial&#34; is the initial state of the set, which can be scooped. The scooped value is computed by constructing the lower level view. &#34;Insert&#34; is a set of objects which must be in the set at that level, which is static. &#34;Remove&#34; is a set of objects which must be excluded from the set at that level, which also is static. The sets &#34;insert&#34; and &#34;remove&#34; are disjoint, and any or all of the sets may be empty. None of the three sets contain members which cannot be visible at level 1. 
     A routine is provided for handling unordered aggregates. Membership of an object is represented as a datum, (object), visible at the lowest level where both the object and the aggregate are visible. That is, given: 
     a: Aggregate; visible at L 1   
     x: Object; visible at L 2  existence is assumed for: 
     in(x, a) : boolean; visible at lub {L 1 , L 2  } For simplicity, these virtual attributes are associated with the aggregate. Also, for any pair (x, a) for which no stored answer exists, in(x, a) is defined to be false. Stored annotations appear when membership data is modified, and the annotation data is made visible at the level of the update. The lowest instantiation of the aggregate is assumed to be a full-bodied aggregate object, or an empty one with a number of explicit annotations. Thus, an 1-instantiation can be modeled as &lt;initial state, modifierl 1  , . . .&gt;; where Initial state is either scooped, i.e., a copy of the lower level view, or static, i.e. (a reference to a full-bodied aggregate), and Modifier 1 , . . . represents the additional membership information at that level. The modifiers are always static. Using this model, 1-view construction is accomplished with the following routine: 
     Scoop all the lower level values by copying the lower level 1-view into a 1 . 
     For each t=in(x, a) at level 1, if t is false and x is in al, remove it; otherwise, if t is true and x is not in a 1 , insert it. 
     The model provides upward data flow of membership information. Membership data at lower levels is seen at higher levels. Multiple options for access control are also provided. It is possible to decouple 1-views by severing the scooping link on initial state. Also, it is possible to maintain sensitive membership information without losing access to the latest lower level information by scooping initial state. 
     A dictionary model is provided as a set of pairs &lt;key, target&gt; where &#34;key&#34; is a reference to the key object and &#34;targetis&#34; a reference to the object associated with &#34;key&#34;. As with sets, a dictionary viewed at level 1 cannot have &#34;key&#34; references to objects which cannot be visible at 1, since this would make it impossible to use the key to place or locate the &#34;target&#34; object. As with sets, 3-tuples are maintained at each level after polyinstantiation. In this case, the sets &#34;insert&#34; and &#34;remove&#34; do not share any pairs with identical &#34;keys&#34;. Alternatively, the parts of &lt;key, target&gt; pairs may be polyinstantiated. However, this may introduce &#34;key&#34; or &#34;target&#34; references to objects which are invisible at some levels. 
     As a further refinement, &#34;key&#34; and &#34;target&#34; can be modeled to provide defaults. This would be used, for example, to provide default non-null targets at particular keys until such information is provided at a lower level. An implementation model for arrays and lists is provided. 
     Unlike dictionaries and sets, arrays and lists impose positional constraints on their members and make the representation of generalized modifiers difficult. For example, lists and Arrays can be modified at random accessed locations, and have their boundaries shifted. Furthermore, it is not possible to determine the intended meaning of an operation by studying the modifications alone; for example: 
     
         ______________________________________OC.sub.-- Array *a =OC.sub.-- lookup (&#34;MyArray&#34;);int i = a-&gt;upperBound();a-&gt;upperBound(a-&gt;upperBound() + 10); // expand by 10// stuff new stuff at endwhile (i &lt; a-&gt;upperBound ()) {(*a)  ++i! = new SomethingNew(i);______________________________________ 
    
     Tracking these updates as absolute array indices and then updating the lower level view of the array to a different size, the changes would probably be applied with the wrong meaning. Tracking these updates as updates relative to the head and tail of the array, changes at absolute indices cannot be represented. Additionally, it is not generally possible to determine the programmer&#39;s intended meaning by static or dynamic analysis since a programmer may optimize operations and totally obfuscate the intended meaning. Further, lists support expansion and shrinkage at the head, tail, and middle, thus changing the indices of potentially all list members. This would seem to indicate that the representation of modifications in a generally usable fashion is virtually impossible for these two classes. However, with the following variants on OC --  List and OC --  Array, a practical representation of change may be derived: 
     1. The list class allows expansion only at the head or the tail, and does not support random addressing (a double ended queue). The allowable operations are: 
     insert at head; 
     insert at tail; 
     remove first member; 
     remove last member. 
     2. The array class has fixed boundaries, and cannot expand or shrink. In this case the data model becomes that of a simple object with a finite number of properties. Different boundaries may be allowed at different levels of visibility, as long as the boundaries never change at all levels. 
     Note that this model also subsumes lower level C++vectors. In this case, the lower bound is always fixed at 0. 
     In representing multilevel aggregates, the management system provides several options. One option is an atomic representation at every instantiated level. The construction of an 1-view requires no information from a lower level view, and is not sensitive to changes in the lower level state after polyinstantiation. The technique is general, simple, and applicable without need for special case analysis. However, this technique is too coarse if emphasis is placed on up-to-date access to all visible membership information. In a second option, in addition to total separation between levels, the management system also presents techniques for presenting multilevel aggregates that retain upward data flow of membership information. The techniques are applicable to sets and dictionaries (OC --  Set, OC --  Dictionary), but cannot be applied to list and arrays (OC --  List and OC --  Array) because we cannot derive a robust representation of modification for these classes. However, for generalized lists and arrays, only the first option is applicable. 
     It should be understood that various changes and modifications to the above described method and apparatus may be made without departing from the inventive concepts disclosed herein. Accordingly, the present invention is not to be viewed as limited except by the scope and spirit of the appended claims.